extern int hardpoints1[]; 
extern int result[];
extern int N;
extern int no_of_levels;
extern int Lvspp;
extern float received1[];
extern float signal_to_noise_ratio1[];
extern int Deinterleaver1[];
extern float L[2][3];
extern float PL[2][3];
 
extern int maxiter;
extern int N1;
extern int SDCorMSC;

 

extern char puncturing[13][17];
extern char tailpuncturing[12][13];

extern float partitioning[4][8];

extern int RX[13];
extern int RY[13];


#ifndef VITERBI_DECODE_HPP
#define VITERBI_DECODE_HPP

#ifndef	STATES
#define		STATES 64			/* number of states */
#endif
#ifndef	NOOFBF
#define		NOOFBF 32			/* number of butterflies */
#endif
#ifndef QOFB
#define		QOFB 8				/* number of different output patterns per input symbol */
#endif
#ifndef NOPB
#define		NOPB 4				/* number of parity bits */
#endif


/* decoder output for zero input, states 1:32 */
static char CODER_OUTPUT[] = {0,6,3,5,3,5,0,6,4,2,7,1,7,1,4,2,1,7,2,4,2,4,1,7,5,3,6,0,6,0,5,3};


int viterbi_decode (float *llr, int N, int N_PartA, char *puncturing1, char *puncturing2, char *puncturing3,
			char *infoout, char *cwout, int bitpos, int *Deinterleaver, int L, int N_tail, char *memory_ptr);
#endif

float received1[4674] =
   {
-0.190941, -0.900675, -0.073269, -0.788217, -0.177215, -0.823088, -0.581127, 0.471996, 1.082675, 0.833175, 
0.865516, 0.932597, 1.175104, 0.141712, -0.547405, -1.111613, -0.916084, 0.171966, -1.161623, 0.292409, -0.519674, -1.227919, 
-1.088811, 1.185241, 0.547162, -0.191144, 0.155449, 0.325537, -0.138456, -0.165993, 0.478006, -0.553694, -0.786449, -0.793015, 
-0.120054, 1.092542, 0.797400, 0.753179, -0.430886, 0.835720, -1.099081, 0.756767, 0.157314, -0.372671, 0.478082, 0.241709, -0.167851, 
0.860211, -0.554682, 0.112019, 0.574945, 0.193556, 0.768346, -0.221237, -0.752344, -0.180901, 0.195151, -0.187279, -0.426973, 1.100485, 
-0.621989, -1.180795, -1.090437, 0.734250, 1.142423, -0.806674, -0.154083, 0.946682, -0.623399, -0.081869, -0.907534, -0.502584, 
0.513453, 0.159376, -1.178611, -1.258472, 1.136722, 0.849822, -0.200651, 0.811373, 0.684428, 1.124582, -0.523916, -1.096265, 
0.478515, -0.841332, -0.535302, 0.509781, 1.181325, -1.098484, 0.791963, -0.467245, 1.087904, -0.252775, 1.103881, 1.176221, 
-1.053671, -0.132223, 0.396132, 0.641072, -1.140134, -0.780142, -1.084334, 0.560647, 0.400662, -0.508778, -0.812914, -0.774230, 
-0.717425, -1.094004, 0.257622, 0.840448, -1.185807, 0.234812, 1.105744, 0.436686, 0.895702, -0.101829, 0.197557, -1.067791, 
0.073843, -0.653691, -1.157398, 1.116142, -1.206579, 0.911979, -0.808065, -0.193450, 1.083123, -1.003886, -0.103135, -0.336509, 
-0.745027, -0.128777, -0.032158, -0.552657, 1.034862, -0.850624, 0.375153, -0.485922, -0.185588, 1.120476, 0.857359, 0.805961, 
0.808901, -0.720082, 0.731353, 0.756727, -1.114268, -0.550188, 0.855137, -0.507286, -1.101957, 0.129887, -1.320381, -0.610332, 
-0.785593, 1.121396, -0.451833, -1.075266, -0.907708, -0.691464, -0.507754, -1.170112, 0.989101, -0.692167, 0.120640, -1.174007, 
0.548165, -0.611154, -0.402168, 0.344926, -1.103267, -1.008853, 0.159251, -0.575096, 1.187884, 0.922397, 0.165140, 0.421189, -0.124592, 
0.713213, -1.048233, 1.007361, -1.036950, -1.083843, -0.045336, -0.203168, 1.170954, -0.457013, 0.081874, 1.183082, -0.783533, 
0.855074, 0.181849, -0.771920, -0.550304, -0.739589, -0.329416, 0.876822, 1.188138, 1.031155, -0.754030, -0.435630, -0.405784, 
-0.426598, 0.726598, -0.791196, 0.796607, 0.487997, 0.482179, 0.189627, 0.200205, -0.118149, 0.953570, 0.762979, 1.135007, 
-0.398886, 1.051330, -0.479526, 0.194077, -0.699965, 1.095839, -0.422546, -0.965674, 0.778007, 0.493923, -1.089065, 0.749900, 
-0.223823, -0.340044, 1.265796, -0.796680, 0.776765, -0.785612, 0.539375, 0.822098, -0.760545, 0.453336, -1.188613, -0.180865, 
-0.088404, -0.149250, -0.848745, -0.036171, 0.696147, -0.734389, -0.272638, -0.822407, 0.491320, -0.497900, 0.175928, 0.171057, 
-0.228808, 0.505175, -0.847540, 0.030892, 0.515653, 1.155820, 0.895388, -0.170361, -0.586766, 1.093050, -0.372040, -0.133301, 
0.504934, 0.811209, -0.245445, -1.121058, -0.455878, 1.203382, 0.873963, 1.064996, -1.137266, -0.251460, 0.118705, 1.140795, 
-0.133296, -0.581552, -0.469921, -1.116562, 0.806667, 0.187555, -0.214513, -0.391477, -0.524953, -0.161399, -0.117507, -0.376539, 
0.700371, 0.092456, 0.041560, -0.091892, 0.107688, 0.152310, -0.729786, -0.409310, 1.169789, -0.050806, 0.504383, -0.386349, 
0.491103, -1.088203, 0.810883, -1.102916, -0.175117, -0.726270, 0.722255, 1.082881, -0.142160, 0.194679, 1.218884, -0.476458, 
0.862138, 0.422881, 0.570565, 0.820073, 1.039833, -0.504180, -0.523404, 0.812878, 0.507528, 0.769587, -0.171400, 0.329941, 
0.815545, -0.114755, -1.029470, -1.011783, 0.134168, 0.830231, -0.972522, 0.808205, -0.726007, 1.192029, -0.413654, 1.111805, 
0.181278, -1.105275, -0.964425, 1.042673, 0.719831, -1.006682, 0.557969, -0.528336, -0.089106, -1.072392, 1.142357, -1.044721, 
-0.223348, -0.748627, -0.823379, -0.179405, 0.595407, 0.541944, 0.236185, -1.053273, 0.229774, 0.887621, 0.381418, 0.769023, 
-0.490686, 0.773031, 0.708620, 0.816427, -1.035005, -0.797831, 0.479269, -0.315143, 0.156031, -0.707626, 1.143821, 0.838346, 
0.367096, -0.253647, 0.089942, -0.136274, 0.707896, -0.046409, 1.173581, -0.120601, 0.214622, -0.104734, -0.452673, 0.550366,
0.854520, 0.122287, -0.397671, 0.631221, -0.795899, -0.455595, 0.770075, 1.118349, 0.895798, -1.094883, -0.367795, -0.461470,
0.101492, 0.308551, -0.732294, -0.265277, -0.105141, 0.273316, -0.803825, 1.149198, -0.783265, -0.507277, 0.740241, 1.323023, 
0.399165, 1.035381, -1.234147, 1.067957, 0.792218, 0.408821, 0.458545, 0.427710, -1.165290, 0.132625, 0.518883, -0.798520, 
-1.096920, 0.227280, 1.126465, -0.518597, -0.178667, 0.536004, 0.448725, 0.779647, -0.869652, 0.773548, -1.116322, -0.539387, 
-0.855636, -0.468373, -0.432660, 1.123054, 0.403242, 0.482124, 0.588651, -0.376180, -0.125495, -0.487418, 0.698358, 0.235463, 
0.193427, 1.036752, 1.044003, 0.197186, 0.962786, 0.017728, 1.134784, -0.410488, -0.945171, 0.075660, -1.110321, 1.082581, 
0.332861, -0.077877, -0.434972, 0.424349, 0.141785, 0.497386, 0.149331, 0.578440, -0.528692, -0.048957, -0.067159, 0.049738, 
0.853277, 0.136746, 0.821172, 0.500515, 0.114427, 1.212418, 1.113720, 0.805484, 0.163711, 0.160043, -0.741461, -0.506401, 
-1.164023, 0.925965, 0.634825, -0.822543, 0.415121, -0.795111, -1.108970, -0.207856, -0.788924, 0.605898, 0.072726, 0.183201,
0.163060, 0.174326, -1.093013, -0.167594, -0.259368, -1.164112, 0.121438, -0.163969, 0.807382, 1.106472, -0.491100, -0.758417,
0.132012, 0.685950, 0.493076, 0.726433, -0.798318, -0.124359, 1.140502, 0.806060, 1.028881, 0.088715, -0.706858, 0.492609, 
0.528630, 1.168586, 1.247002, -0.819067, 0.404575, -0.446049, -1.036483, 0.489672, 0.364853, 0.507407, 0.381777, -0.736502,
-0.487690, 0.150967, -0.401662, 0.496094, -0.721838, 0.815121, -0.419770, -0.245394, 0.395583, -0.447330, 0.190478, 1.122252, 
-0.514207, 0.221903, -0.508523, -0.514374, -0.417753, -1.128509, -0.155958, -0.780515, 0.792648, 0.123126, 0.177170, 0.536397, 
-0.513031, 1.080188, 0.785415, -0.206086, -0.114744, 0.176367, 0.873137, 0.762971, -0.369291, -0.152895, 0.176349, -1.094118, 
0.335246, 0.028910, 0.456568, 0.169368, -0.297479, -0.112672, 0.412286, 1.116476, -1.139024, 0.543008, 0.987008, 1.217936, 
-1.216139, -0.844848, -0.983257, 0.264395, 0.794163, 0.444820, 1.040764, -0.750872, -0.440144, 0.172343, 0.097010, 0.183219,
0.467850, -0.151797, -0.399581, -0.774270, -1.033269, -0.088641, -1.069663, -0.745444, 0.214104, 0.140943, 1.046745, 0.861749, 
-0.529762, 0.505161, -0.798507, -0.661581, 1.185091, 0.442243, -0.880311, -1.211123, 1.221600, -0.704417, -1.074446, 0.611570, 
0.071070, -1.318553, -0.274252, -0.890241, -0.005649, 0.877144, -0.906426, -0.099482, -1.201965, 0.806746, -1.195324, -0.367131, 
-0.054937, 0.470413, -0.165013, 0.985747, 0.214455, -0.711580, -0.284540, -0.981858, 0.106783, 1.095424, 0.279251, -1.050011, 
0.749060, 0.503439, 1.334488, -1.117340, 0.935437, 0.432827, -0.829608, 0.866814, -0.439507, 0.807308, -0.982847, 1.045428, 
-1.129668, -0.172816, -0.263131, -0.101399, -0.156460, -0.761639, -0.165511, -0.422838, -0.135085, -0.745314, -0.211745, 
-0.839843, 0.118116, -1.178331, 1.148418, -1.014739, -0.193034, 0.127882, 1.100356, -0.242310, 1.191678, -0.584408, 0.822149,
-0.133429, 0.145715, -0.134351, -0.692037, 0.930815, 0.524154, 0.681757, -0.424173, 0.039018, -0.038328, 0.289757, 0.594422, 
-0.621303, 0.506459, -0.676107, 1.104521, -0.176030, 1.019094, -1.233567, -0.388286, 0.570628, 0.408983, 1.247192, -0.198318, 
0.407876, -0.835210, 0.549825, -0.940527, -0.826969, -0.836184, -0.464947, 1.160841, -0.440098, -0.096299, 1.233082, -0.763689, 
-0.411698, -0.730453, 0.332897, -0.880179, 0.112606, 1.133830, -0.524172, 0.239869, 1.050689, -0.270420, -0.495169, 0.183271, 
1.283745, 1.094564, 0.459412, 0.485196, -0.317874, -0.199487, -0.584077, -1.005946, -0.342381, 1.118602, -0.146957, 0.712832, 
-1.041293, -0.745460, 0.773361, 0.468196, 0.354722, 0.865185, 0.498256, 1.022285, -0.146895, -0.472818, 0.780509, -1.326342, 
1.148287, 1.070077, -1.041685, -0.195008, 0.741968, -0.573077, -1.246424, 0.536369, -0.218296, -0.564917, 0.797130, 0.455984, 
-0.760463, -0.685676, -0.371111, -0.163725, 1.023025, 0.758018, -0.101160, -0.827341, -0.506968, 0.864668, 0.480672, -0.845982,
0.762860, -0.165764, -0.595187, -0.103548, -0.077191, -0.766289, -0.178254, 0.501199, 0.834491, 0.894920, -0.202082, 0.542430,
-1.068914, 0.400628, 0.186148, -0.725688, 1.071597, -0.848772, -1.155483, -0.863446, -0.574773, 0.807630, -1.011267, -1.045834,
-0.126019, -0.804348, 0.800606, 1.163842, -0.553630, -1.115516, 0.477634, 0.677561, -0.541840, -1.293718, 1.118314, 
0.137087, -0.507933, -0.192703, 0.364233, 0.786134, 1.004708, 0.571307, -1.143467, 0.400682, -0.836126, -0.428634, 
0.169392, -1.114878, 0.547052, 0.224974, -0.535633, -0.417539, 0.527869, 1.108955, 0.854447, -0.233464, -1.032569, 
0.459188, -0.442544, -0.975544, -0.055717, -0.524786, 0.444227, -1.097897, -0.456140, 0.509064, 1.208705, -0.225467, 
-0.437270, -0.437959, -1.207676, -0.182208, -0.991461, 0.205798, -0.534999, -1.155067, 0.127028, -1.108314, 1.090608,
0.581859, -0.161195, 1.180282, -0.818424, 0.771745, -0.407960, -0.146325, -0.449488, 0.121854, 0.845298, 0.834196, 
-1.118078, 0.057839, 0.472458, 0.463069, 0.176493, -1.080054, 0.959669, -0.122231, 0.415802, 0.151942, 0.524497, 
0.160392, -0.547977, 0.549104, -0.378496, -0.135520, 0.445444, -0.084330, 0.859146, -0.549088, -0.466776, -0.385261, 
0.187456, -0.822863, -0.467178, 0.840306, 1.127640, -0.694639, 0.341482, 0.161458, 1.039234, 1.082948, 0.133162, 
0.713956, 0.411394, 1.015885, -1.040682, -0.705561, -1.105166, 0.160492, 0.198010, 0.748397, 0.750624, -1.010270, 
1.123883, 0.825194, 1.054712, -0.182412, 0.386800, 0.113969, 1.021357, -0.524745, 0.575178, 0.487005, 0.265175, 
0.277523, 0.639601, 0.763407, 0.995678, -0.462416, -0.436560, -0.571682, 0.110764, 0.450694, -0.176160, 0.466928,
-1.050245, 0.110022, -0.867803, -0.151840, 0.170018, 0.260313, 0.203778, 0.845012, 0.789444, 0.913111, 1.205360, 
1.058920, 0.831075, -0.446926, -0.796936, 0.682095, 0.180571, 0.151735, -0.186298, -0.203529, 0.260899, 0.550568, 
0.626961, -0.243957, -0.440907, 0.174777, 0.561809, -0.522612, 1.101995, 1.197711, 0.192117, 1.130648, -0.111669, 
0.526542, -0.797699, -0.162432, 0.073909, 0.833304, -0.795863, 0.091901, 0.502243, 0.383739, -0.192778, 1.110227, 
-0.479649, -0.427996, 0.164834, -0.821142, 1.150708, -0.721010, 0.878815, -0.787056, 0.410328, -0.419122, 0.136392, 
-0.218671, -0.999576, 0.721389, -0.849109, -0.272337, -0.310990, -0.483552, -1.074729, 0.487786, 0.092547, -0.313631,
0.184703, -1.092517, -1.111243, 0.899130, 0.214326, -0.743620, 0.204622, -0.826332, 0.111314, -1.175074, 0.321218, 
1.113839, -0.839348, -0.154699, 1.077997, 1.041782, 0.457446, -0.811110, 0.212146, -1.059126, 0.441482, 0.405372, 
-0.326467, -0.246338, -0.516190, 0.489985, -0.753285, -0.146997, -0.820467, 0.494546, -1.029728, 0.817119, -0.738296,
-0.110482, -0.111871, -0.015551, -0.747367, -0.856966, -0.265856, 0.827156, -0.436182, 0.787051, 1.081509, -0.416474,
-0.981441, -0.581942, 0.838645, -0.530967, -0.777834, 0.211784, -0.108538, 1.017677, -0.249649, -0.575200, 0.414540, 
0.045173, -0.219661, 0.887881, 1.125068, -0.450958, -1.075304, -0.571163, -0.418565, -1.175554, 0.047699, 0.371774, 
-1.029315, -0.284890, 0.335267, 1.050017, 0.385487, -0.445754, -0.223668, -0.832813, 0.646039, 1.184117, 0.746543, 
0.973447, 0.542564, -1.117101, -0.069107, -1.126266, 0.894945, -1.070066, -0.070300, -1.080919, -0.860964, 0.484438,
1.005184, 0.953187, 0.747190, -0.237031, -1.169176, -0.160054, -0.839964, -0.128656, 0.960149, -0.147465, 0.148104, 
0.727137, -1.056059, -0.571477, 0.067809, 0.348603, 0.518245, -0.472871, 1.140603, 1.154993, 0.859996, 0.123363, 
-1.227543, 0.131224, 0.333422, -0.294647, -0.248393, 0.164136, 0.893644, 1.275652, 0.503294, 0.702363, 1.018661, 
-0.458661, 0.913547, -1.023913, 0.782921, 0.169747, -0.375296, -0.871471, 0.428263, 1.178566, -0.236883, 0.790387, 
0.157424, 0.910447, 0.488696, -1.125243, -0.330791, -0.717040, -0.730102, -0.314208, 0.343604, 0.199154, -0.765692, 
-1.200596, 1.134562, 0.101440, 0.432496, 0.153466, 0.176444, 0.414878, -0.373245, -0.964488, -0.468352, -0.408042, 
-0.939913, 0.435969, -0.482580, -0.475245, 0.025739, -1.069322, 0.896888, -0.838535, 1.150775, -1.090609, 0.679509, 
-1.059956, -0.384056, 0.068375, 1.201302, 0.510666, -0.169819, -0.465595, -0.705470, 1.046530, -0.705605, 0.151491, 
0.418335, 0.304866, 1.018025, -0.298347, -0.228875, -1.039164, 0.762189, 0.463500, -1.272087, -1.070129, -0.117856, 
0.109770, 0.527194, 1.311890, 0.182273, -0.516147, -0.394986, 0.654967, -1.197542, 1.093195, -0.167184, 0.051113,
0.831810, 1.110225, -1.104211, -0.582913, 0.114184, 0.138116, -1.202522, 0.143561, -1.127285, 0.883219, -0.450598, 
-0.168362, -0.881482, -1.120582, -0.826682, 0.161349, -0.478909, 0.353454, -0.726649, 0.466639, -0.869257, -0.554904,
-1.024688, -0.792199, 0.879839, -0.480517, -0.449974, 0.278681, -0.727999, 0.461425, 1.112356, 0.822875, -0.355021,
-0.843094, 0.231881, -1.121851, 0.913111, 1.037827, 1.296868, -1.123538, 1.043805, -0.855124, 0.540971, -0.843227, 
-0.220234, -0.631619, 0.161366, 0.499551, -0.660387, -0.793230, -0.250734, -1.007997, 0.726857, -0.866310, 0.479259,
0.477184, -0.567517, 1.076415, 0.741549, 1.199864, -0.164548, -0.421599, -0.502522, 0.741900, -0.136061, 0.876451,
1.224833, 1.215070, -0.037498, -0.177471, 1.153350, -0.757312, 0.262703, 0.654535, 0.349751, 1.044609, 0.459042, 
0.805004, 0.115886, -1.130963, 1.018277, -0.923676, -1.249605, 1.265359, 0.454021, 0.753084, 0.172356, -0.398568,
0.511385, 1.154549, -0.781626, 0.546354, 0.425881, 0.127760, -1.013397, 0.895590, 0.457233, -0.583243, -0.962484, 
0.765477, -1.160766, 1.085428, 0.802949, -0.010458, -0.798711, -0.152534, -1.065845, 0.838573, 0.831223, -0.463219, 
0.813147, 0.101198, 1.160658, 1.107102, -0.416677, -0.590975, 1.047428, -0.182561, -0.702386, -1.216513, 
1.278644, -1.195774, 0.885718, 0.440452, -0.795999, 1.176828, 0.434141, 0.170817, -0.507327, 1.132993, -0.181406, 
0.922179, -0.812022, -0.807694, -0.130811, 0.863924, 0.246015, -0.307741, -0.751340, 0.564512, 1.030690, 
-0.595638, -1.121264, 0.736646, -0.321651, 0.854058, -0.555287, -1.053956, 0.808603, 0.507397, 0.472951, 
-1.011425, 0.912844, -1.052531, 0.829057, -0.148709, -0.762481, -1.051048, 0.779127, 0.197005, -0.507168,
-0.177677, -0.523661, -1.181933, 0.458301, 0.552419, 0.120285, 0.147032, -1.100262, 1.030567, 0.108847, 
1.161381, 0.491181, -0.121376, 0.333667, -0.423969, -0.691206, -0.387246, -1.149350, 0.573913, 0.596511, 
-0.703605, -0.695005, -0.812019, -0.747632, 0.124714, 1.165923, -0.062660, 1.184722, -0.158606, -0.916133, 
0.029261, -0.859381, -0.869497, 0.830712, 0.459248, 0.480222, -0.919851, -0.449630, -1.048621, -1.147984, 
-0.679633, 0.164835, 0.325422, 0.807421, -0.389209, 1.139708, -0.840516, -0.296805, -0.190405, -0.747225,
-1.130577, -0.200993, 0.131915, -0.071066, -0.184268, -1.090494, -0.231329, 0.725672, -0.708851, -0.087735, 
0.632180, 0.378491, 1.086624, -0.782976, 1.277207, -0.707704, 0.845279, 0.092816, 0.836590, -0.494153, 
0.378819, -1.147327, 0.765085, 1.084103, -0.909293, -0.439047, 0.267983, -0.048652, -0.756445, -0.438758, 
0.481499, -0.235489, -0.484269, 0.150967, 0.498204, 0.119207, -1.039011, -0.159174, 0.204336, -1.191921, 
-0.465658, -0.065202, -1.106980, 0.403054, 0.666844, -0.101233, 0.041669, -1.209022, 1.265414, -0.441044, 
-0.748838, -0.095673, 1.103216, 0.518239, -0.598916, 1.058480, -0.874568, 1.057975, -1.172434, -0.555110, 
-0.585636, 0.578498, 1.082306, -1.071834, 0.943613, -0.448381, -0.254286, -0.209746, 0.835059, -0.117009,
0.657251, -0.198071, 0.786242, 0.613153, 1.039263, -0.274024, -0.767118, -0.818947, 0.218461, 0.747614, 
1.214847, -0.759461, 1.132703, 0.707685, 1.176650, -0.796446, 0.787149, 0.626863, 1.060839, -0.707260, 
0.006381, -0.052622, -0.705099, -0.468396, 0.256976, -0.173762, -1.125935, -0.448984, 0.757642, -0.884106,
0.157193, 0.189396, 0.910743, -1.070957, 0.491997, 1.119460, -1.029567, -0.488819, -1.027661, 1.202058, 
0.490985, -1.019584, 0.172058, -0.160190, -0.476141, 0.803978, 0.970881, -1.087064, -0.231451, -0.535776, 
-0.380702, 1.002799, -1.069172, 0.333024, 0.615736, -0.396754, 0.399325, 1.093764, -0.411162, -1.027430, 
1.088648, -1.208530, 0.416679, 0.516762, -0.074255, -1.012898, 0.968100, -0.902451, 0.188731, 0.670935, 
0.414831, 0.138159, -0.704649, 1.018142, 0.701202, -0.740583, 0.527227, -0.385651, -0.837254, -0.448720, 
-1.165091, -0.182349, -0.441252, -0.490284, 0.116595, -0.205919, 1.116068, 0.482895, -0.681000, 0.869618,
0.745508, -0.903863, 1.109784, -0.722699, 0.146933, -0.466764, -1.240970, -0.457148, 0.465084, 0.674387, 
-1.127538, 0.380594, 0.772957, 1.063020, 0.915046, 1.092307, -1.144440, 0.866006, -0.999168, 0.452480, 
-0.475450, 1.200717, -0.502736, -0.888302, -0.454876, -0.225582, 0.171520, 0.437454, -0.894848, -0.773992,
1.085305, 0.777471, 0.371292, -1.076586, 0.752864, -0.195553, -0.951588, 0.080934, -0.251700, 0.775800, 
0.042826, 0.556437, -0.730783, 1.039131, -1.058373, -0.474177, 1.016743, -1.201227, 0.453177, 0.842333, 
-0.745647, 0.291171, 0.481785, 0.119523, 1.054832, 1.238273, -0.840464, 0.993328, 0.467401, 1.144823, 
1.145715, 0.157224, -0.771256, -0.134839, 0.456549, -0.495865, -0.383655, -0.265793, 0.195185, -1.031879,
-0.999898, 0.994872, 0.492951, 0.694607, 0.078561, 1.155554, -0.536137, -0.823548, 0.451726, 1.180697, 
0.155934, -0.150657, 0.169480, 0.195366, -0.109975, -1.077410, 0.282573, -1.095564, -0.034808, -0.655872,
0.408855, 0.143010, -0.163448, -1.114754, 1.163202, -0.002750, -0.746805, -1.033761, 0.793295, -0.450523, 
-0.697969, -0.208643, 0.162520, -1.097910, -0.207124, 0.307331, -0.791502, 1.047988, 0.648332, -1.112909, 
-1.080553, -0.146550, -0.786800, -0.548325, 0.140981, 0.764374, -0.907926, -0.448977, 0.909231, -0.570172,
-0.112713, -0.723717, -0.823647, -0.208213, -0.410135, 0.766521, 1.083599, -1.083934, 0.406096, 0.362342, 
1.149991, -0.405930, -0.662350, -0.147262, 0.438252, 0.924403, -1.127551, -0.404798, -1.076442, -0.147202, 
0.223703, 0.796853, -0.213478, -0.647359, 1.127299, -1.143320, -0.772129, -0.399351, 0.761433, -0.143089, 
-0.478439, -0.752883, 0.867520, 0.251033, -0.552193, -1.008987, -0.535488, 1.188124, -0.875601, -1.007058, 
-0.092599, 1.070489, 0.754211, -0.784568, 0.470838, -0.690030, 0.859533, 1.152027, -0.092635, 0.754691, 
-0.690100, -0.554613, 0.766756, -0.528088, 0.473712, -1.054318, 0.736208, 1.270803, 0.415036, 0.408051, 
-0.670530, 0.147057, -0.646038, -0.150161, -0.714961, -1.113598, 0.756995, -0.436462, -0.538786, 0.241646, 
0.489471, -0.980411, 0.199881, 0.124823, 0.467607, -0.485692, -0.774578, 0.055622, 1.086301, 0.734989, 
0.770660, 0.501137, -0.415007, -1.119368, 1.182571, -0.063701, 0.158662, -0.449117, 0.194360, -0.521408, 
0.089839, -1.035228, -0.491823, -1.155264, 0.947837, -0.171703, -0.044998, 0.444512, -1.062693, 0.159844, 
-1.155947, 0.164299, 0.724693, 0.121139, 0.834235, -0.556099, -0.199599, 0.302484, 1.075362, -0.647039, 
-0.226304, -1.144648, 0.027828, 0.741613, 0.102691, 0.459085, 1.039049, -0.286667, -0.131219, 0.743762, 0.234268, 
0.537300, -0.428739, -0.430780, 1.186830, -0.618353, 0.971521, 0.096216, 0.751538, -0.232621, 0.834678, 1.193270, 
-0.504332, -0.487237, -0.462986, -0.825585, 0.459670, 0.443591, 0.099649, 1.115168, 0.169074, -1.122680, -1.177207, 
1.014431, 0.816885, 0.417975, -0.408236, 0.086266, -1.048182, -0.808798, 0.067306, 0.788836, -1.182800, 0.629870, 
-0.765747, -0.585848, -0.438190, -1.130308, 0.379240, 0.889320, 1.117937, -0.542989, -0.489213, 0.965776, -0.392091, 
-0.833727, 1.019352, 1.082068, -0.143943, -0.758459, -1.092911, 0.511944, -0.794813, 0.229115, -1.112762, -0.821761, 
-0.502594, -0.682778, -0.180853, -0.176753, 1.034265, 0.802181, 1.112079, -0.508962, 0.090613, 0.840823, 
1.192506, 0.981829, -0.022552, -0.858718, -0.526282, -0.476496, 0.051971, 1.124568, 0.471386, -0.254054, 
-0.501369, -0.723558, -0.734064, -0.215457, 0.143972, 0.733053, -0.640921, -0.892535, -1.117274, -0.825760, 
-1.131783, 0.703107, -0.750388, -0.133329, 1.195375, 0.273221, 0.070480, -0.765665, 0.126820, 1.203433, 
-0.138102, 1.124670, -0.221180, 0.246380, 0.101428, 0.851409, -0.507587, -0.235770, 0.324355, 0.524514, 
0.141113, 1.051125, -0.436595, -0.411787, 0.733415, 0.238090, -0.349990, 0.214397, 0.451124, 0.747099, 0.730005, 0.355299, -0.767448, 1.004757, 0.175493, 1.156060, 0.790267, -1.164756, -0.175761, 0.081805, -0.330551, -0.162495, -1.008385, 1.182414, -0.555653, 0.976453, -0.881297, 0.700999, -0.202623, 0.089343, -0.815610, -0.612433, 0.117788, 0.792129, -0.748511, -0.769908, -1.030066, 1.032524, 0.184396, -1.121966, 0.542136, -0.445944, -0.184015, 0.460020, 0.516612, 0.832442, -0.162634, -0.686719, -0.489691, 0.762573, -1.140585, -1.131713, -0.358472, 0.764653, -0.815342, 0.720517, -0.500825, 0.214329, -0.354084, -1.088551, 0.371507, -0.871581, -0.589191, -0.145161, 0.658099, 0.818331, 0.448859, -0.055750, -1.222674, 1.025165, 0.536763, -0.226726, -0.437430, 0.253185, 1.321788, 1.095566, 0.154187, 0.785571, -0.533672, 0.451943, -0.573033, -0.833749, 1.067216, -1.179831, -0.537941, -0.158197, -1.074989, -1.102139, 0.438698, -1.172460, -1.001602, -0.878628, 0.486497, -0.991586, 1.152861, -1.176533, -1.021756, 0.818005, 0.462008, 0.790730, 0.782807, 0.078894, 0.998115, 0.842503, 1.021938, -0.976525, -0.221513, -0.504076, -0.187481, -1.002484, -0.846034, 0.801966, 1.032741, -0.782799, 0.187362, 0.722350, -0.027386, 0.129862, 0.689212, -0.413662, 1.164217, -1.256223, 0.164197, -1.029250, 0.531927, 0.761536, 0.413349, -1.052411, 0.932859, -1.162480, -0.348180, 0.139103, 0.150792, 1.080303, 1.235154, 1.091078, 0.027987, 1.087280, -0.102642, -0.425978, -0.796766, 0.982265, 0.797037, 0.786767, 1.334048, 0.148731, 0.923483, 0.114623, -1.315954, 1.071512, 0.824216, 0.659309, -0.166918, 0.544446, 0.197061, 0.206430, -1.144057, 1.128085, -0.291526, -0.441765, -0.712825, 0.671308, 0.636603, 0.863324, -0.759867, 0.784352, -0.815347, -1.055254, 0.616321, -1.096808, 1.230929, 0.168202, 0.912116, -0.615934, 1.007881, 0.166285, -0.545769, -0.719611, 0.214802, -0.752752, -0.813744, 0.781714, -0.213166, -0.817075, 1.121159, 1.198573, -0.705553, -0.802216, -0.794264, -0.393495, 1.205847, -0.133772, -0.949634, -0.545410, -0.169630, -1.167031, 0.711610, -0.757706, -0.051485, 0.880840, 0.590559, -0.694197, -0.561714, 0.705304, 0.426008, -0.778936, -1.197450, 0.132906, 1.037535, 0.772855, -0.124212, -0.951989, -0.811265, -0.985725, -0.078472, -0.919522, 0.568073, -1.017438, 1.160241, 0.797288, -0.104273, 1.083792, 0.955540, 1.177063, 0.729270, -0.643748, 0.571819, -0.203589, 0.877832, 0.481015, 0.594903, 0.790108, -0.350582, -0.510204, -1.182188, 1.046870, -0.719405, 0.557234, -0.058841, -0.442636, -0.646330, 0.194189, 1.045354, 0.490868, 1.011490, 0.217278, 0.798332, -0.204930, -0.028511, -1.076523, -1.203347, 0.772812, 0.737652, 0.811130, -0.169743, 0.269509, 0.779515, -0.767441, -0.126208, 1.037059, 1.073674, -0.481923, -0.902536, 1.019255, 0.587583, 0.823116, -0.094677, 0.711395, 0.787179, -1.209025, 0.248789, 0.478196, -0.591906, -0.413640, 0.083809, -1.080104, -1.098961, 0.397619, -0.177782, 1.064334, -1.064499, -0.187757, -0.965904, -0.451311, 0.709814, 1.224898, 1.024995, 0.470743, 0.717132, 0.160049, 1.202090, 0.386970, 0.560901, -1.205051, 1.130167, 0.899746, 0.644022, 1.120818, 0.290739, -0.962478, 0.759230, -0.207090, 1.125762, 1.178878, 1.047770, 0.993982, -0.767945, -0.891455, -0.840073, 1.078947, 0.678461, 1.070018, -0.193851, -0.108702, -0.856534, -0.389932, 0.184672, 0.208578, -0.780262, 1.052445, -0.408578, 0.232599, 0.989992, 0.108572, -0.790842, 0.180709, 0.087355, -0.992498, 1.054280, 0.297853, -0.843830, -0.130258, 0.499883, 0.172989, 1.050733, 0.345039, 1.195197, 0.160597, 0.201897, 0.417531, -0.034506, 0.303670, 0.089330, -0.727769, -0.746945, 0.206298, -1.303597, 0.843635, -0.957854, -1.069381, 0.135237, 0.230429, -1.165759, -0.963434, -0.277439, -0.716803, 0.735997, -0.755521, -0.822500, 0.505877, -0.213574, -0.187658, 0.247525, 0.197849, -0.441787, -0.216083, 1.177281, -0.959379, -0.090087, -0.004386, 0.486846, 0.464245, 0.551141, 0.562492, -0.290999, -0.119811, 0.415893, 1.134213, 0.509693, -1.165709, -0.102393, -0.470924, -1.139341, 0.230459, 0.174449, -1.207362, -0.117373, 1.073665, 1.087124, -0.804516, -1.114281, -0.155254, -0.526822, -1.165147, -1.098321, 0.180038, 1.177086, 0.126296, 0.095937, 0.193833, 0.992033, 0.097833, 0.734860, 0.131298, 1.151148, -0.413590, 0.188752, 0.132408, -0.930698, 0.118190, 0.511958, -0.702840, 0.798400, 0.465856, 0.337794, 0.874881, -1.198255, 0.488299, 0.533340, -1.190567, 0.356826, -0.988284, -0.156197, -1.009195, -0.162472, 0.984460, 0.059598, 0.560055, -0.141205, 0.944184, -0.673311, -0.593699,0.432666, 0.479997, -0.198972, -0.810427, 0.384488, 1.112187, 1.046946, -0.134819, 0.464939, -1.234563, 1.121929, -0.974284, 0.397525, -0.881220, -0.825588, 1.030240, -0.813492, -1.142223, -0.114945, -0.450394, -1.117591, -1.228523, 0.233472, -1.027099, 0.780496, 0.204255, -1.133253, -0.262157, -0.447967, -0.509413, 0.388079, -0.819220, -0.738187, 0.099757, 0.514119, 1.115441, -0.977373, -0.650105, 0.362992, 0.182382, 0.445154, -0.792778, 0.848221, 0.233541, 1.004355, 0.452528, -0.412477, 0.403629, 0.724889, -0.114807, 0.214013, 0.783898, -0.199890, 0.248893, 0.448684, -0.240301, 1.202703, -0.761591, 0.398833, 0.535539, -0.784812, 0.397813, 0.171954, 0.104866, 0.010878, -0.780580, 0.822583, -0.982200, -0.580603, -0.829244, 0.444145, -0.789071, 0.439027, 0.872219, -0.454454, 0.758915, 0.441699, -0.945712, 0.761971, 0.647604, -0.487736, 1.107796, -0.520498, 0.777029, -0.084678, 0.888054, 0.096007, 0.648459, -0.472031, -0.168836, -0.770925, -0.784981, 0.389570, -0.699792, 1.191458, 1.159381, -1.044708, 0.779409, 1.044589, -0.193261, 0.611345, -0.508249, -1.141517, 0.101879, -1.155039, -0.484877, -0.533324, 0.432834, -0.087626, 0.951037, 0.730440, -0.077184, -0.465336, 0.199235, -0.061091, 0.144747, 0.759851, -0.411771, -0.434443, 0.678387, 1.066866, 0.111298, 1.184531, -1.101508, -1.137839, -1.091922, 1.129237, 1.188363, 0.145970, -1.033544, 0.805158, 0.508576, 1.076038, -1.054778, -0.359220, -0.241163, -1.119182, 0.025370, 1.080997, 0.528301, -0.907124, -0.602533, 1.150932, -0.479432, -1.127126, 0.831176, 1.134989, -1.134123, -0.551513, -1.083368, 1.143858, 0.476151, -0.554882, 0.951627, 1.047296, -0.827989, 0.374214, 0.125745, -0.464227, 0.333478, 0.853559, 0.235485, -0.041053, 0.859979, 0.402210, 0.747419, -0.131110, -0.782434, -1.132873, -0.417957, 0.443668, 0.346112, 1.177790, 0.520311, -0.759605, -0.471486, -0.195417, -0.065378, 0.462744, -0.884199, 1.155869, -1.209342, 0.437907, 0.565361, -0.074956, -1.240151, 0.365511, 1.043570, -1.058531, 0.328574, -0.145459, -0.248670, -0.177961, 0.993728, -0.457042, -0.132748, -0.011593, -0.315030, 1.064061, -0.598532, -1.063529, 0.743595, -1.212528, -0.859532, 1.060790, -0.455087, -0.778132, 0.287546, 0.801902, 0.216535, 0.463348, 0.121926, -0.878094, 0.541543, -0.061639, 0.528864, -1.118014, -0.953850, -1.015461, -0.760047, -0.813418, 0.693117, 1.144839, -0.849627, -1.048086, -0.877564, 0.751563, 1.269732, -0.999631, 0.145581, -0.742050, -0.149016, -0.211757, 0.514328, -0.247498, 0.645675, 0.662150, 0.105706, 0.647628, -0.529222, -1.301733, 0.436051, -0.863015, 0.479843, 0.188848, -0.774127, 0.851296, 0.771632, 0.087831, -0.519818, -1.162416, -0.594250, 0.806174, 0.772504, -0.155255, 0.611831, -1.028315, 0.753070, -0.911004, -0.750164, -1.014376, 0.529586, -1.302238, -1.091716, -0.133276, 0.705547, -1.024163, -1.179596, -0.344668, -0.154360, 0.386822, 0.858685, -1.124837, 0.172155, 0.429730, 0.792151, 0.816960, -0.309174, 1.189381, -0.342309, 1.173255, -1.053118, 0.166752, 0.319645, 0.190163, 0.762127, -0.496675, 1.082166, 0.188872, -1.140542, -0.104173, -0.860770, 0.705884, 0.383847, -1.059174, 0.341992, -0.477443, -0.089751, 1.096499, -0.552771, -0.483575, -0.527714, -1.263039, 0.325364, 0.136049, 0.217189, 0.010155, -0.114853, 1.084076, 0.126697, -0.798943, -0.939021, 0.511312, 1.186444, 1.108388, 0.436741, -0.827484, -0.033888, -0.720655, -0.161410, -0.187543, 0.298808, -0.090613, -0.744834, 0.196649, 1.025907, -0.733118, -0.070292, 1.009780, 0.077795, 1.155521, -0.967259, 1.191660, 1.224607, -0.766737, -0.161166, -0.763339, 0.750733, -0.555205, -0.372035, 0.641966, 1.097287, 1.038820, 1.193918, -0.970239, 0.563137, 0.267487, -0.102141, -0.264446, -0.756835, -0.679073, -0.444754, 0.167300, 1.007289, -1.034963, -0.866460, -0.581838, -0.708583, 0.538753, 1.039779, -1.202126, -0.167972, -0.795861, 0.747605, 0.432374, -0.153934, 0.424591, 1.068925, 1.059203, -0.458376, 0.118244, -0.454733, -1.108326, -1.065417, 0.180664, 0.806714, -0.111035, -0.007299, 0.933680, -1.028318, -0.387170, -1.007326, -0.139124, -0.313517, -0.901783, 0.649180, -0.434759, 0.155051, 0.909189, 1.024455, -0.093598, -0.096795, 1.043440, -1.066509, 0.476366, 1.178794, 0.808879, -0.195732, 1.206608, -0.268670, 1.081638, 0.422544, 0.871948, 0.045099, 0.073980, -0.224755, -0.452465, -0.054811, 0.365313, 0.833275, -0.570601, -0.908668, 1.141644, 0.900241, -0.473666, 0.414540, 1.129075, -0.402456, 0.087960, -0.079386, 0.151726, 0.213257, 1.037241, 1.250035, -0.421068, 0.436824, -0.118133, -0.734844, -0.209827, -0.795595, 0.064874, -0.205176, -1.104165, 0.188772, 0.570819, 0.387878, -0.764500, -0.593700, -0.500101, -0.846545, -1.049354, 1.009363, -0.191035, -0.779803, -0.815079, -1.146128, 1.074425, 0.933422, 0.088812, -0.922959, -0.805299, 1.177199, 0.093014, -1.156467, -1.062407, 1.164670, -0.577794, -0.475187, 0.787633, 0.647827, 0.450635, 0.766700, -0.413656, 0.055387, -0.162142, 0.758243, -0.699629, 0.562763, -0.152722, 1.222123, 0.548745, 0.209945, -0.130467, -0.577644, 0.166168, 0.584669, -0.775675, -0.567206, -0.488716, -0.192537, -0.082280, -1.070387, 1.063748, -0.713162, 0.390627, -0.951653, 0.662803, 0.400925, -0.337596, 0.160413, -0.841845, -1.072730, 0.199011, -0.475721, -0.139835, 1.147350, 1.210422, -0.514798, -0.076247, 0.490826, 0.233677, -1.031761, 0.778544, -1.144245, -0.785290, 0.198728, 1.105274, 0.476194, -0.594869, 0.550965, 0.465415, -0.265927, -0.518974, 1.034969, 0.135130, -0.431673, 0.401318, -0.143034, 0.786447, -0.178645, 0.283359, -0.452469, 0.513343, -0.519395, -0.517333, 0.098358, 0.505364, -0.813579, 1.224731, -0.406863, 0.095779, -1.190893, -0.987062, 1.067126, 0.121814, 0.710283, -0.838019, -1.084428, 0.403935, -0.143020, -0.446810, -1.154960, 0.710024, -1.154425, 0.383756, 0.046082, -0.568750, -0.206711, 0.243914, -0.188957, -0.429183, -0.224860, 0.113584, -1.127277, 0.250626, 0.097426, 0.869977, -0.494393, -1.226380, 1.090700, 0.852825, -0.512926, 0.761428, -1.254852, -1.085322, 1.218057, 0.732864, 0.175989, 0.087267, -0.769084, 0.436724, 0.177572, -0.662149, -0.201048, -0.142814, 0.063623, 0.062376, -0.184456, -0.889058, 1.034315, 0.470282, 0.722528, -0.035921, 0.844680, 0.508396, 1.130960, 0.166949, 0.731626, 0.440925, 0.780695, 0.459479, 0.736341, -0.377789, 0.718696, 0.998765, 1.205245, -0.156879, -0.225102, 0.709440, 0.251081, 0.444639, 0.720940, 0.207555, 0.785512, 1.225422, 0.505751, -1.117855, -0.459172, 1.127021, 0.622691, -0.762101, 0.662719, 1.139044, 0.445571, 1.049566, -0.448888, 1.087688, 0.459943, -0.386334, -0.439029, -0.832720, 0.817350, 0.209507, 0.534370, 0.511747, -0.860157, 0.212065, 0.790895, 1.023381, -0.773664, -0.120597, 0.728495, 0.515144, -0.036603, -0.671195, -0.145004, -0.347910, -1.280610, 0.798917, -0.294756, 0.984773, -0.394345, 0.151529, -0.852833, -0.715873, 0.706914, -0.120267, -0.147645, -0.715845, 1.072305, -0.122946, 0.235394, -0.188509, 1.176585, 0.502891, -1.085657, 0.542756, 0.186904, 0.175554, 0.141996, -1.135245, 0.200639, 0.137599, -0.309860, -0.173326, -0.779329, 0.449046, -0.657287, 0.167530, -0.132443, 0.947302, 1.005049, -0.773789, 1.119248, -0.488718, 0.928384, 0.124646, -1.086729, -0.825512, 0.637541, 0.176700, 0.557098, -0.786350, -0.158033, -0.616930, 0.768982, -1.042399, -0.165879, -0.228045, -0.243939, 0.184243, -0.526112, -1.135279, -1.159641, -0.830245, -0.708837, -0.740976, -0.711425, -0.793620, -1.156607, -1.145481, 1.038604, 0.123808, -1.182343, 0.362706, 0.532016, -0.418878, 1.159100, 0.537568, -0.688209, 0.843216, 0.196320, 0.146042, 1.150990, 0.219369, 1.130188, -1.153201, -0.788802, -0.791277, -0.449784, -0.496311, -1.126379, 0.145894, -1.068905, -0.810275, -1.079632, -0.111409, 0.085936, 1.117487, 0.845218, 0.521945, 0.492529, 0.244906, 1.050128, -0.228337, -1.099978, -1.130848, -0.801653, 0.075983, 0.844671, 0.139067, -0.098078, 0.468588, -1.070837, -0.276804, -0.716640, 0.605182, -0.090442, -1.099838, -0.777092, 0.851245, 1.077349, 0.198793, -1.019250, -0.910883, 0.433881, -0.094507, -0.453480, 0.196790, -0.477868, -1.009542, -0.145566, -0.477788, 1.078942, 0.098046, 0.752953, 0.293477, -0.512396, 0.472806, -0.388591, 0.942546, -0.293806, 0.804993, 0.450989, -0.437784, -0.836878, 1.108386, 0.170076, -0.387633, -0.831191, 0.277717, 0.216034, 0.742838, -0.717176, -0.813183, -0.158069, -1.138576, -0.707034, 0.909792, 0.343567, -0.379181, 0.292726, -1.044355, 0.250853, -0.548649, 0.140733, 0.859026, 0.666319, -0.122369, -1.144768, 1.118808, 0.920429, 0.823674, 1.019937, -0.510961, 1.173317, 1.060315, -0.851585, 1.002833, -0.247129, 0.073032, 0.477166, -0.766647, 1.183208, -0.115426, 1.031181, -0.171413, 0.451402, -0.771968, -0.196121, -1.036041, -0.852215, -1.049861, 0.267251, 0.099311, 0.496398, 0.133622, 0.877384, -0.224342, 0.528119, 1.018032, 0.330556, -0.534450, 0.136401, -1.055999, -0.486121, 0.531870, -0.722887, -0.663181, 0.815917, 0.725513, -1.210844, -1.121169, -0.198239, -0.228093, 0.146314, -0.849033, 0.101186, 1.049939, 0.781647, 0.489843, -0.468581, 0.757757, -0.506455, -1.000833, 0.723240, -0.598611, -1.206121, 0.572738, 0.521396, -0.465150, -0.145050, -0.217215, -0.617461, -1.136750, 0.909400, -0.549766, -0.745154, -0.164714, 0.519254, 0.340267, 0.401055, -1.065400, 0.146514, 0.230092, -0.906234, -0.053459, -1.047249, 0.395769, -0.715611, 0.414588, -0.245205, 0.139125, -0.329684, -0.247848, -1.244180, -0.137701, -1.227098, 0.885703, -0.187218, -0.889417, -0.540214, 0.123377, 0.464926, -0.420135, 0.765441, 0.952550, -0.327639, 0.953702, -1.092733, -0.556272, 1.160936, 0.186693, -0.452625, -0.120542, 1.206732, -1.114272, 0.619987, 1.017108, -0.159864, 0.596470, 1.109514, -0.500431, -0.854264, 1.126808, -0.459110, 0.459476, -0.409637, -0.224587, 0.681087, 0.141919, -0.385057, -0.707851, -0.136762, -0.557209, 0.181863, 0.597501, 0.797395, 0.185661, -0.462283, 0.205153, 1.066174, 0.774621, 0.077350, -0.692222, -0.487081, -0.672670, 0.513290, 0.903819, 0.769063, 0.930810, -0.342260, -0.539432, 0.813918, 0.858230, -1.189592, -0.833967, 1.085158, 0.097685, -0.535322, 0.705303, -0.156140, 0.223104, -0.742462, 0.795556, 1.009633, -1.129323, 0.092792, 0.056167, 0.821757, -0.077719, 0.188737, 0.404167, 0.461536, -0.101185, 0.568260, -1.207195, 0.779374, 0.662166, -0.217797, 0.204477, -0.655508, -0.999404, -0.207316, 0.529469, -0.079334, 0.918236, -0.366350, -0.162005, -0.686639, -0.393375, -0.822938, -0.607186, 1.271728, 0.779309, -1.234989, -0.133685, 0.749223, 0.071628, -0.721035, -1.025507, -1.107648, -0.885899, -0.118973, -0.870444, -0.600855, 0.061034, 0.721464, 0.069702, 0.020571, 0.830205, 0.164500, -0.812605, -0.812329, -1.142313, 0.582403, 0.802857, -0.502575, 0.527586, 0.174484, 0.249939, -0.394450, -0.719473, 0.564064, -0.422041, -0.585093, 0.367857, -0.152605, 0.786987, 0.244228, 1.233916, 0.703418, 0.538888, 0.811653, -0.811301, -1.144992, -0.970644, -0.343094, -0.149214, 0.481413, 0.193363, -0.388661, 0.704532, -0.475021, -0.360741, 0.794641, 0.977285, 0.448967, -0.814714, 0.397348, -1.088844, -0.563662, 1.120031, 0.904827, 1.058464, 0.681889, 0.804059, 0.883222, -0.191080, 1.129797, 1.252008, -0.649403, 1.053575, 0.229218, -1.259643, -1.067290, -0.929030, -1.304441, -0.984037, 0.167352, -1.295709, 0.722126, 0.762589, -1.192595, 0.457206, -1.225078, -0.558289, -0.746726, 0.531339, 0.219954, 0.839159, 0.680686, 1.161616, 1.091768, -0.759850, 1.133290, -0.186052, 0.062244, 0.157452, -0.477214, 1.182809, 0.396135, 0.756796, 0.679876, -0.478985, -1.211580, -0.451329, 0.283659, -0.093911, 1.082744, -0.444779, -0.899059, -0.830038, -0.824001, -1.124399, 0.426374, -0.232646, -0.511529, 1.151897, 0.751571, -0.160820, -0.846940, 0.788857, 1.076737, 0.829489, 1.158579, -0.805607, -1.191531, 0.709409, 0.716135, 0.762504, 0.739716, 0.995569, -0.016217, -0.411947, -0.188843, 0.429167, -0.124990, 1.110998, 0.690169, 0.737755, -0.081971, 0.451315, -0.117875, 1.042634, 0.146446, -0.431668, -0.182776, 0.069515, 0.816462, -0.699198, 0.205360, 0.146853, -0.387977, -0.337900, -0.219609, -0.820085, 1.054475, -0.426736, 0.820611, -0.743515, 1.134433, -0.739077, -0.996094, -0.513570, 0.165414, -0.659522, -0.139582, 0.392231, 0.835477, 0.813783, 0.134845, 1.033920, -1.232374, -0.448088, 0.291991, 1.075154, -0.152595, -0.179644, 0.437539, 0.828403, 0.150191, 1.013622, 0.728919, 0.734877, -1.104421, -0.104599, -1.081951, -1.138952, -0.815422, -0.889877, 0.010311, 0.849119, 0.058915, 1.031229, -0.193130, 0.152743, -0.186546, -1.073781, 0.732798, -0.888881, -0.177040, -0.878831, 1.053429, -0.947716, 0.122543, 0.501252, 0.800258, -0.532101, -1.242409, 0.824061, 0.812703, -0.126820, -1.116606, 0.182466, -0.993191, -0.101939, 1.175952, 0.372392, -1.002733, -0.209560, -0.488141, 0.466339, -1.121822, -0.156103, 1.100136, 0.610968, -0.113325, -0.724786, 0.058385, 0.683903, -0.218191, -0.612308, 0.137582, 0.266277, -0.692287, -0.477045, 1.086156, 1.279581, 0.417262, -0.467995, 0.082499, 1.134301, -1.009942, -0.098368, -0.861651, -0.384313, 1.226495, -0.324580, -0.214238, 0.161040, -0.775588, -0.337846, 0.664592, -1.094326, -0.491521, 0.477964, 0.005565, 1.045550, -0.415428, -1.261114, 0.737772, 0.054763, 0.794767, -0.425069, -0.648755, 0.459005, -1.210438, 0.050674, -0.696581, -0.363153, 1.247355, 0.038878, 0.803459, 0.306682, -0.867765, -0.496677, 0.524792, -1.080379, 0.375527, 0.450750, 0.991001, -0.428931, 0.448965, 1.186286, -0.764706, 0.164239, -0.406182, 1.101156, -0.366293, -0.999626, -1.036910, 0.958323, 0.001946, -0.549131, -1.170236, 0.157117, 0.644248, -0.152982, -0.086177, 0.770508, 0.066846, 0.758556, -0.324502, -1.162593, 0.880090, -0.795729, 0.683391, -0.051772, -1.019611, -1.114115, 1.257083, -0.102514, 0.260739, -0.446098, -0.391767, 0.673546, -0.171518, -0.311080, -0.507049, -0.547666, 0.165349, -0.422019, 0.795817, -0.702392, -0.432274, -0.122138, 0.506754, 0.986428, -0.543997, -1.092020, -0.810509, 1.002323, 0.974538, -0.744087, -0.753363, 0.125065, -0.965639, -0.764479, 1.085131, 1.031785, 1.131154, -0.194566, -0.478811, -1.058333, -1.110492, -1.112633, 1.138747, 1.087772, 0.062090, 0.243087, 0.998381, -0.988320, 0.406622, 0.160098, 0.301380, -0.182513, -0.414759, 1.045449, 1.079864, -0.141249, -0.412598, 0.806445, -0.798870, -0.330123, 1.241380, -0.643625, -0.113668, -0.447124, -0.960231, -0.843798, 0.334882, 0.429529, 0.700896, 1.073530, -0.449906, -0.191705, 0.128056, 1.212301, -0.122686, 0.712885, 0.177832, 1.085213, -0.458128, 0.839141, 1.085242, -1.060033, -0.188977, -0.838409, -0.888243, 0.292067, -1.045789, 0.877476, -0.558447, -0.908373, 1.089588, -0.746284, 0.391820, 0.810217, -0.068396, -0.436433, -0.221837, 0.398593, 1.230126, 0.392416, -0.549810, -1.034103, 0.794577, -0.109534, 0.234534, 0.160651, -0.700793, 0.211328, -0.107150, -1.178456, -0.095363, -1.257632, 0.498038, -0.215011, 0.795969, -0.024779, 0.088121, -0.208957, -1.128383, 0.459145, 0.169486, -0.086901, -0.090408, 0.652327, 1.118832, 0.686867, -0.382804, -1.109073, 0.032568, -0.970556, 1.152495, 0.423139, 0.225704, -0.106658, 0.177580, 0.591511, 1.086999, -1.161729, 0.782210, 0.769853, 0.976959, -0.418564, 0.228100, 0.162780, -1.085623, 1.032391, -0.275551, -0.845244, -0.222399, 0.852521, 0.810244, 1.206982, 0.445932, 0.159173, 0.204437, -0.392705, -0.276440, 1.367724, -0.197821, -0.152555, -0.524965, 0.373935, 0.775509, 1.062193, 1.303425, -0.437867, -0.444977, 0.896969, 1.051188, 0.044775, -0.159967, -0.733720, -0.460868, 0.846460, 1.080099, -0.718005, -0.273329, 1.064701, 0.979459, -0.199756, -1.115077, -0.396539, 0.183917, -0.861495, -0.520298, 0.876053, -0.393241, 0.735770, -0.752970, 0.491855, 1.031442, 1.194543, -1.041976, -0.179623, -0.798228, -1.155813, 1.226914, 1.089291, 1.117129, -0.512590, -0.162714, -0.301123, 1.127655, 0.239719, 1.094075, 0.104908, 1.059089, -0.140301, -0.882458, 0.726288, -0.371365, -0.196765, -1.194468, 0.743653, 0.848933, -0.424086, 0.504417, 0.411602, -0.856955, -0.510749, 1.051729, -0.045928, 1.124120, 0.224570, 0.383970, 0.288997, 0.129915, 0.360537, -0.963997, 0.887067, -0.796224, 0.437916, -0.758019, -0.820426, 0.171098, -1.086618, 0.977541, 0.198441, -1.070763, -0.897222, 0.059522, 0.495465, 0.813954, -0.221052, -1.115700, -0.363040, 0.346646, 0.501360, 0.183593, 1.282527, -0.728473, 0.768399, 0.123217, -1.063555, -0.143748, -0.229909, -0.304028, -1.137039, -1.176777, -1.255169, 0.483602, -0.787454, 0.765765, 0.417947, 1.137411, 0.441410, 0.196100, 0.348778, -0.448292, 1.103444, 0.101944, 0.184035, -1.153507, -1.024515, -0.471763, -0.022844, -0.882792, -0.988557, 0.839390, 0.470142, 0.800780, -0.508188, -1.170973, 1.148203, 0.093384, 0.172320, 0.829544, -0.873467, -0.751041, -0.538560, -0.825115, -1.080405, 0.488509, 0.181126, -1.086182, 0.798130, 0.073442, -0.314720, 0.437246, 0.829618, 0.389852, 0.809727, 0.696748, 0.860340, 0.159000, 0.383924, 1.121816, 0.867510, 0.487201, -0.100164, 1.146017, -0.892669, -0.892619, 0.176606, -0.117907, 1.081203, -1.001421, -0.349022, 1.135986, 0.131062, -0.489655, -0.936835, 1.143408, -0.581077, -0.984604, 0.825379, -0.810617, 0.525311, -0.786780, -0.405130, -0.099772, 0.748526, 1.078041, 0.166721, 0.722270, 0.974057, 0.131050, 0.800713, 1.117940, -0.451572, -0.153003, 1.057267, -0.725793, 1.074714, -0.186468, -1.219804, 0.720545, -0.624196, 0.785182, -1.147568, -0.144769, -1.330395, -1.054862, -0.200096, -0.669662, -0.438132, -0.830467, -0.776668, 0.525696, 0.736267, 0.596884, -1.092712, 0.607453, -0.526321, -0.479554, -0.908975, -0.756863, -1.105181, 0.114585, -1.098505, 1.163538, -0.200893, -0.499513, -0.947214, 0.080477, -0.132958, 0.263262, 0.037438, -0.389193, 1.173712, -0.293145, 1.167157, -0.748496, 0.564322, 0.961207, 0.091860, 0.231647, -0.801014, -0.455977, -0.108401, 0.765094, 0.116310, 0.070778, -0.841802, 0.213293, -0.496580, 0.950222, 1.116667, -1.037586, -0.470555, -0.855429, 1.321478, -0.113611, -0.871244, 0.248344, 1.163737, -0.673038, -0.526520, 0.813378, 0.757432, 0.435451, 0.477249, 0.122963, -0.795622, 1.107106, -1.250222, -0.515558, 0.139724, 0.512205, -0.259504, 0.771221, -0.675503, -1.307231, 0.143170, 1.052595, -0.872036, -0.144450, -0.716141, 0.043735, -0.201795, -1.052038, -0.240617, 1.145141, 0.077868, 0.528016, -0.725368, 0.463131, -0.287307, -0.119823, -1.126499, 0.714096, 0.515586, 0.810702, 0.465197, 0.106249, 0.830634, -0.459694, 0.204714, -0.098870, -0.847281, -0.160881, 1.048000, 0.497994, -0.143959, 0.240418, 0.750182, -0.872407, 0.505810, 0.699785, 0.192760, -0.461089, -1.231910, 1.029302, 0.487308, 0.531780, 0.149897, -0.078939, 0.207917, -0.439060, -0.158647, -0.901424, -1.113141, 0.988709, -0.522549, 0.640268, -0.832797, 0.921088, 1.261790, 0.174549, 0.817713, -0.470726, 0.545298, -0.802747, -1.166126, -1.088651, 1.048117, -0.076853, -0.825175, -1.121928, -1.039678, 1.137338, 1.086004, 0.938489, -0.504201, 0.278170, -1.275839, -1.143924, -0.795263, 1.094167, -1.130306, -0.810614, 0.672844, 0.597578, -1.139395, 0.783105, -0.190479, 0.718483, -1.298424, -0.476669, 0.239537, 0.526628, 0.483013, 0.415277, -0.979926, 1.187164, -0.218865, 0.934255, -1.074054, 0.257320, -0.523764, 0.201446, 0.767890, 0.752692, 0.466197, -0.776438, -0.468281, -0.709193, 0.271296, -0.240336, 0.317685, 0.378777, -0.740334, 0.651507, -0.739600, 0.051313, -0.377853, 0.795565, 0.520731, -0.781459, 0.103442, 0.048091, 0.105960, 0.744743, -0.757021, -1.070654, 0.498023, 0.834159, 0.894202, -0.477622, -1.063288, 0.069559, -0.148481, -0.494129, 0.468996, -0.753764, -0.143324, -0.384946, -1.107078, -1.152725, -0.831413, -0.130273, -1.170385, 1.117730, 0.759579, 0.217179, 1.102156, 0.506063, -0.181191, -1.109568, -0.410091, 0.883273, -0.148920, -0.280874, -0.444187, 1.128919, 0.544200, 0.223076, 0.125966, 0.025545, -1.097667, 0.746477, -1.000007, -0.891959, 0.509610, -0.981946, -0.807228, -1.105850, -0.668668, -1.193004, 0.820205, 1.114023, -1.147570, 0.470108, 1.123203, 0.398160, 1.171105, -0.739196, -0.118415, -0.405834, -0.596673, -0.861869, 0.746960, -1.036724, 0.078134, 0.900396, -0.800493, 0.143401, -1.219500, 1.055914, 0.670330, -0.188963, 0.429457, -0.686809, -0.787889, 0.774797, -0.168490, 1.000543, 1.167336, -0.249416, -0.233117, 0.745136, 0.368912, -0.741723, 1.194273, -0.814288, -0.456719, -1.127724, 1.101718, -0.479314, -1.145290, -0.729809, 1.096312, 1.134064, -1.219592, 0.569966, -0.483465, -0.789005, -0.942396, 0.835635, 1.164263, 1.192286, 0.839116, -0.828676, -0.496880, -0.091541, 0.892644, -0.762637, 0.806552, -0.762725, -0.391105, 0.879644, -0.067580, -0.464154, 1.188999, 0.417777, 0.116507, 0.482263, 0.167297, -0.429288, -1.220715, 0.388712, 0.191713, -0.442832, 0.860752, -0.720073, -0.211769, -0.138655, 0.149694, 0.539786, 0.833002, -0.392225, 1.126170, -0.100699, 1.158228, -0.010079, 0.848140, 0.829573, 0.188708, -0.819112, 0.974984, -0.842276, -0.601858, -0.605288, 0.363462, 0.585519, -0.253586, 0.865914, -1.030543, -0.930490, 0.743982, -1.119548, 0.162506, -0.166755, 0.124543, -0.307571, 0.784170, -0.100509, 0.156690, 0.477675, -0.469957, -0.177882, -0.133171, 1.177187, -0.215494, 0.743043, 1.242208, -0.503953, 1.236865, 0.730482, -0.835239, 0.781021, 0.390772, -0.363243, 0.108911, 0.225113, -0.479822, 0.129230, -1.074334, 1.120772, 0.529141, -0.379120, 0.168990, 0.643786, -0.819891, -0.930343, 1.102459, -0.202432, 0.875442, -0.529502, -1.091202, -0.958195, 0.820383, 0.809516, -0.843043, 0.825428, 0.490768, 0.447338, 0.800230, 1.000460, 0.848943, -0.068058, -0.857684, 1.066062, -0.038106, -0.169143, 0.182822, -1.057459, 0.444994, -0.423653, -0.177715, -0.530985, -0.838515, 1.287496, -0.667093, 1.065447, -1.065121, 1.075880, -0.335218, -0.454836, -0.460238, -0.671300, 0.814688, 0.551943, 0.803226, -0.968834, 1.154902, 0.025547, -0.121821, -0.946933, -0.507788, -0.722475, -1.119247, -0.840799, 0.783315, -0.109984, 0.846501, -0.711518, 1.069594, -1.152036, 1.013587, 0.073297, 0.781798, 1.114257, 0.477834, -0.689902, 0.541083, 1.056469, 0.494719, -0.817497, 0.667908, 0.708267, 0.487200, -1.054252, 0.981329, -0.619486, -0.696550, 0.317425, 0.756024, -0.399838, 0.241117, -0.183868, -0.193397, 1.122581, -1.115788, 0.874783, -0.128388, 0.474412, 0.966419, 0.822724, 0.775516, 0.966331, -0.262787, -1.118131, -0.872379, 0.378285, 1.162358, -1.015410, 1.087072, -0.761061, -1.113947, -0.736836, -1.064142, 0.386181, -0.491428, 0.197055, 1.066262, -0.802774, 0.747418, -0.332825, 0.111160, 0.750134, -1.051805, 0.818493, 0.464031, 1.225727, 1.192662, -1.016261, 1.069698, -0.308760, -0.790961, -1.140328, -1.018633, -0.208700, -1.138575, 0.862295, 0.127847, -0.847771, 1.079647, 0.116650, 0.601786, -1.166269, 0.749925, 1.027099, 1.205617, 0.791925, 0.162719, 0.486470, -0.765701, -0.120180, 0.162816, 1.197618, -0.395535, 0.075841, -0.838987, 0.860445, -0.129440, -0.941975, -0.834128, 0.976571, 0.523615, -0.040786, -0.211728, -0.435308, 0.204245, 1.143170, -0.247916, 1.214985, 0.867731, -0.153403, -1.117745, 0.099586, 1.045627, 0.859254, 0.119757, 0.479484, -0.866264, 0.221837, -0.193989, 0.163011, 0.100603, -0.163930, -0.794471, -0.186883, -0.250765, -0.121078, 0.503230, 0.231248, 0.854654, -1.087370, 1.004043, -0.129755, -0.199440, -1.174016, 0.232014, 0.807679, -0.174724, -0.101348, 0.213222, -0.475552, 0.521796, -0.160305, 0.427874, 0.741347, -0.151499, 0.734456, -0.654753, -0.115043, -0.419707, -0.149325, 1.256797, 1.143072, -1.195975, -0.576777, 0.480206, -0.528526, 0.169741, -0.511334, -0.915752, 0.628656, -0.814782, 0.544036, -1.281786, 0.700533, 0.138609, 0.269488, 0.386362, 0.454398, -0.512692, 0.425021, -0.939344, 0.452693, 0.774186, 0.463029, -0.780625, -0.442550, -0.517000, 0.462502, -1.098243, -1.078555, 0.144931, -0.717022, -0.111099, -0.450683, -0.549397, 1.150871, 0.513443, -1.169847, -1.118080, 0.177456, 0.423163, 0.153816, 1.068522, -0.200924, 0.999286, -0.416769, 0.586553, 0.766985, -0.206145, -0.722865, -0.115392, 0.845946, -0.526850, 0.166961, -0.410998, 0.307838, -0.423977, 0.902644, -1.200332, -0.761991, 1.091335, 0.375380, -1.069259, -0.872626, -0.739369, -0.133860, -0.472926, -0.102753, 0.798528, -0.130915, -0.890452, -0.477095, -0.152438, 0.197765, -0.505052, -0.212870, 0.844773, 0.874727, 0.731345, -0.429805, -0.187751, -0.413267, 0.463922, -0.460944, 0.452167, 0.532302, 0.999945, -1.039731, -0.264033, 0.755114, -0.689147, -0.202544, 0.130202, 0.444253, -0.404154, 0.308631, -0.072508, 0.137032, -0.373238, -0.984003, 0.581641, 0.881018, 0.074965, -0.400501, 0.144166, 0.084617, -0.910589, 0.476497, -1.084158, -0.088073, -1.141778, -0.398078, -0.776449, 1.047982, -1.015647, 0.825974, 1.031823, -0.316052, 0.133980, -0.770147, 0.257578, 0.496528, -1.132833, 0.397010, -0.607349, -0.819354, 0.189576, 1.128603, 1.260895, -0.424436, 0.936065, -1.124158, 0.763888
   };

float signal_to_noise_ratio1[4674] = {
0.393715, 1.672622, 1.214389, 1.605457, 1.600427, 1.646314, 1.274963, 1.443474, 1.376112, 1.252615, 1.556581, 1.423824, 0.585588, 1.687633, 1.744444, 1.119634, 1.929362, 1.856877, 1.808463, 0.960471, 2.099486, 1.781546, 0.998407, 1.653898, 0.770204, 0.821984, 1.472295, 1.865836, 1.518062, 1.451816, 0.428413, 1.635123, 1.985004, 1.139938, 0.525816, 2.105062, 2.017009, 1.403941, 1.672951, 1.964037, 1.671192, 1.549140, 1.660952, 1.597540, 1.861296, 1.605568, 1.803899, 0.642588, 1.638309, 1.627381, 1.516262, 0.902965, 1.532090, 1.719226, 1.059451, 0.345488, 0.726969, 1.560939, 1.460670, 1.358774, 1.427734, 1.396547, 1.507057, 0.887444, 1.578852, 1.423672, 1.446180, 0.607393, 0.383082, 2.004506, 1.177146, 1.539470, 1.594736, 2.267167, 1.560149, 1.704136, 1.028878, 0.489124, 1.614503, 2.026417, 1.525952, 0.995096, 1.573331, 1.942768, 1.180615, 1.592817, 1.493299, 1.422591, 1.819785, 0.671973, 1.351388, 0.563347, 1.536931, 1.095524, 1.758882, 1.584782, 1.619464, 1.576093, 1.442302, 1.477587, 1.359273, 1.489969, 1.087122, 1.235025, 1.153271, 2.190620, 1.286408, 1.427068, 0.755217, 1.460076, 2.010229, 1.458411, 1.934971, 1.087912, 1.113326, 1.691381, 1.196393, 1.537332, 1.021748, 1.625533, 0.397789, 1.633973, 1.219102, 1.576388, 0.740528, 1.624363, 1.766219, 0.808647, 1.799842, 2.096534, 1.160900, 2.255762, 1.653816, 1.614896, 0.334780, 1.499857, 1.142995, 1.044799, 1.639468, 0.690378, 0.814142, 1.229386, 1.779672, 1.620499, 2.018805, 1.160827, 0.878131, 1.607089, 2.179993, 0.644986, 0.941760, 2.050766, 1.265464, 1.681093, 1.037714, 1.154828, 1.605400, 1.336155, 1.742967, 1.667646, 1.399451, 1.671748, 1.797082, 0.879311, 1.477882, 0.440773, 1.237569, 1.603407, 1.569351, 1.738191, 1.070774, 0.656717, 0.473068, 1.306747, 1.282804, 1.659129, 0.884816, 0.861835, 1.190500, 1.959608, 1.052884, 1.226724, 1.948954, 0.943919, 1.449346, 0.749908, 1.360304, 1.739535, 1.177076, 0.465282, 1.686869, 2.378932, 1.476403, 1.222124, 1.663364, 1.815297, 1.446930, 1.625571, 0.495961, 2.311911, 0.945998, 2.039715, 1.568042, 0.734865, 1.618271, 1.419573, 1.146297, 0.486963, 2.126514, 1.745493, 1.203016, 1.418090, 0.587565, 1.159148, 0.869760, 1.406296, 2.080772, 1.514387, 1.611118, 2.122409, 1.942945, 2.032017, 1.754390, 0.872910, 1.528203, 1.455557, 1.653127, 0.622271, 1.787702, 0.657653, 1.463999, 1.956007, 1.216329, 1.050410, 1.413417, 1.576218, 0.912932, 1.172572, 1.675487, 1.208044, 1.387236, 2.048961, 1.258841, 0.437268, 0.583787, 1.889509, 1.344091, 1.022822, 1.845384, 0.848148, 1.569487, 1.502330, 1.497043, 1.154827, 0.892336, 1.186832, 1.888920, 1.543264, 1.291327, 1.644212, 1.503614, 1.651594, 1.527863, 1.801943, 1.859742, 1.533479, 1.426234, 2.029648, 1.500116, 1.622539, 1.555795, 0.988959, 0.818006, 1.703193, 1.480080, 1.605906, 1.073898, 1.319006, 1.606506, 1.483734, 1.559694, 1.706113, 1.514319, 1.060506, 1.688136, 2.148877, 0.536191, 1.553077, 1.895329, 1.800091, 1.013513, 0.791673, 1.550202, 1.647453, 1.457244, 0.349342, 1.504491, 1.475866, 1.344731, 0.999749, 1.220616, 1.888981, 1.027938, 1.740210, 1.065604, 1.148088, 0.841623, 0.928894, 2.140086, 1.392349, 0.841280, 1.051624, 1.902287, 1.656128, 0.887627, 0.896958, 1.325926, 1.330136, 1.021760, 1.236219, 1.946559, 1.755994, 1.698231, 2.028819, 1.214891, 0.411690, 1.068081, 1.714988, 1.017153, 0.582793, 1.499369, 0.861871, 1.135394, 0.940049, 1.907977, 1.900300, 1.859138, 2.038798, 1.456905, 1.484671, 1.311637, 1.501305, 1.442734, 1.729222, 1.439789, 1.024117, 0.529277, 1.630365, 1.383326, 2.036264, 1.636097, 1.423075, 1.225344, 1.643093, 1.447450, 1.520543, 1.561819, 1.720290, 1.915817, 2.065289, 0.539427, 1.614407, 1.362192, 1.595538, 1.401077, 1.098342, 1.780319, 1.591059, 1.637055, 1.725433, 1.843521, 1.756868, 1.036155, 0.414091, 1.692053, 1.492910, 1.243433, 1.172172, 0.612771, 1.938576, 0.502687, 1.277619, 0.611115, 1.158825, 1.873532, 0.883556, 1.300797, 0.349187, 1.610736, 1.706105, 1.538985, 1.455764, 1.513492, 1.092416, 0.799029, 1.578491, 0.484992, 0.878618, 1.347790, 1.305925, 1.060009, 1.219490, 1.078142, 0.397106, 1.350814, 1.054421, 2.298577, 2.105601, 0.751356, 1.411803, 0.773800, 1.497073, 1.969681, 1.574278, 1.726257, 1.273305, 1.783860, 1.308307, 1.709173, 2.078997, 2.106874, 0.801615, 1.729197, 2.266583, 1.451486, 1.039565, 1.662388, 1.656009, 1.330420, 1.951196, 1.657626, 1.461227, 2.052100, 1.471029, 1.322627, 1.467085, 1.577462, 1.545933, 2.023291, 1.597807, 1.440148, 1.673069, 2.034533, 2.091938, 1.598998, 2.173905, 1.164805, 1.873934, 1.945486, 2.007387, 0.471970, 1.620797, 0.815517, 1.244964, 1.855188, 1.847734, 0.303981, 1.568975, 1.557184, 2.045664, 2.063059, 1.935738, 1.502094, 2.068608, 1.675800, 1.792457, 1.721542, 0.509504, 1.091369, 1.630418, 1.459630, 1.460694, 1.841458, 1.872120, 1.650816, 0.888934, 1.660183, 1.367871, 1.391556, 0.513594, 0.493694, 1.706011, 2.285985, 1.696184, 1.932977, 1.522710, 0.746433, 1.847848, 1.397872, 1.572164, 1.467775, 1.567578, 1.800589, 1.896003, 1.577778, 1.561444, 1.649088, 1.369329, 1.732525, 1.988999, 1.140963, 1.686366, 1.332484, 1.172480, 0.422020, 1.506896, 1.645963, 1.469851, 0.317907, 2.434005, 0.382847, 1.547577, 1.233311, 1.772932, 1.497979, 1.333833, 1.293908, 2.075693, 2.204125, 1.082267, 1.233230, 1.723670, 2.237648, 1.696323, 1.569022, 0.878368, 1.134318, 1.360356, 1.196020, 1.501332, 1.670062, 1.957496, 1.805063, 2.049309, 0.928309, 1.882152, 1.544081, 2.362823, 0.537828, 1.585444, 1.765449, 1.397121, 0.517761, 1.068572, 0.454110, 1.532086, 1.787184, 1.505434, 1.625765, 1.571416, 2.144581, 1.310654, 0.508125, 1.901155, 0.859084, 1.337501, 2.027156, 1.877830, 1.548082, 1.581535, 1.246757, 1.971828, 1.143229, 2.140090, 1.200305, 1.189400, 1.885816, 2.231374, 1.353238, 1.513201, 1.512004, 1.521363, 1.105887, 1.378443, 0.957021, 1.516490, 1.551776, 1.429845, 1.983099, 0.986065, 1.009438, 1.772459, 1.580485, 2.014698, 0.889329, 1.684501, 1.694671, 1.702757, 1.285422, 1.624056, 2.135241, 0.996875, 1.155378, 0.815475, 2.129287, 1.801155, 1.430766, 1.469160, 1.656085, 1.588192, 1.955354, 1.526532, 0.483122, 1.212143, 1.785378, 1.571965, 1.564826, 1.868212, 1.345610, 0.795415, 1.809982, 0.796730, 0.749292, 1.572000, 0.513840, 1.488234, 1.535403, 1.607069, 0.942970, 1.825500, 0.868633, 1.388225, 1.129345, 0.611806, 1.761678, 1.616821, 0.337337, 0.548495, 1.811958, 1.985770, 2.259174, 1.584751, 0.959197, 1.246943, 0.374293, 1.415405, 1.649659, 0.478769, 1.856247, 1.143467, 1.919133, 1.551041, 1.484129, 1.194579, 0.708683, 1.548117, 0.819696, 1.657817, 0.408173, 1.884763, 1.960522, 1.357085, 1.503982, 0.990344, 0.710599, 1.202414, 2.189171, 2.130443, 1.542542, 1.729455, 1.990325, 1.608129, 1.674786, 1.467892, 1.878983, 2.035676, 0.386134, 1.037319, 0.811368, 1.757436, 0.341175, 0.484255, 0.746804, 1.576455, 1.143014, 1.679173, 1.882566, 1.485633, 0.948414, 0.520657, 0.882033, 1.595536, 1.738730, 0.424460, 0.698706, 1.686129, 1.699835, 1.661296, 1.623417, 1.702748, 1.486690, 2.087787, 1.604535, 1.811630, 1.731079, 2.121550, 1.464659, 1.144591, 0.526184, 1.639190, 1.903034, 1.794418, 0.483008, 1.312312, 0.479081, 1.881810, 1.423649, 1.711043, 1.618929, 1.762112, 1.588351, 1.447436, 1.453441, 1.524267, 0.507971, 1.645874, 1.875387, 1.290960, 0.863371, 1.232558, 1.539870, 1.381797, 1.526617, 2.352983, 2.141266, 1.794632, 1.615933, 2.086595, 1.126884, 1.603297, 0.963476, 2.135266, 1.606775, 2.168066, 1.111503, 2.070438, 1.666883, 1.883022, 1.599096, 1.448912, 1.921430, 1.663963, 2.074489, 1.089393, 0.638269, 1.545005, 1.738469, 1.374317, 1.672865, 1.929130, 1.795621, 0.526419, 1.342610, 1.391627, 2.002483, 1.614714, 1.594561, 1.857615, 1.322792, 2.178106, 1.306969, 1.956785, 1.442562, 1.498371, 1.558087, 1.717897, 1.146120, 0.570205, 2.190782, 1.967320, 2.067058, 1.889536, 0.518964, 1.990539, 1.238807, 1.790779, 1.718721, 0.559275, 1.571917, 1.170607, 1.405859, 1.381107, 1.008723, 1.537725, 1.054408, 0.484106, 1.330774, 1.670272, 1.397404, 1.931000, 1.547426, 0.711803, 0.783190, 2.192522, 0.876272, 1.831801, 1.319555, 1.243903, 1.604475, 1.578802, 1.207771, 1.221425, 1.536753, 1.496860, 0.860410, 1.254123, 1.021726, 1.245434, 1.166429, 1.304261, 0.996712, 1.239762, 1.329935, 1.453611, 1.306582, 1.883100, 1.273578, 1.508568, 1.600045, 2.117094, 1.694392, 2.175944, 1.638578, 1.589497, 1.635958, 0.809260, 1.194779, 0.562902, 1.387033, 1.177692, 1.699433, 0.929716, 1.977594, 1.506611, 2.003449, 1.529426, 1.503344, 1.415210, 0.717166, 1.797223, 2.056427, 0.914067, 1.210018, 1.679259, 1.236575, 2.008904, 1.571429, 1.558746, 1.669301, 1.492279, 0.420353, 0.716962, 2.020983, 1.951047, 2.047151, 0.380211, 1.621713, 1.449402, 1.680253, 1.637020, 2.035907, 2.277579, 1.981703, 1.252626, 0.807935, 0.986649, 1.620352, 1.082778, 1.441437, 0.622702, 1.581155, 1.049343, 1.157449, 1.175188, 1.588946, 1.012511, 1.586276, 0.636338, 1.450433, 1.525097, 1.857138, 1.532449, 2.432752, 1.865266, 1.395703, 1.355711, 1.203608, 1.533855, 1.244453, 1.707747, 1.533215, 1.681341, 0.828205, 1.452759, 1.690960, 1.120360, 1.205518, 2.007253, 1.345066, 1.690263, 0.548392, 1.456266, 0.907218, 1.754801, 1.573543, 0.487744, 1.338176, 1.310242, 1.627461, 2.078785, 0.605155, 1.874473, 1.933394, 0.705605, 1.379422, 1.668349, 1.747452, 2.222324, 1.723540, 1.578949, 0.994440, 1.705346, 1.389855, 1.819711, 1.196725, 1.434732, 1.565963, 1.728287, 1.532219, 0.568307, 0.997477, 1.907943, 1.644686, 1.409045, 1.501186, 1.589928, 1.562707, 1.845082, 1.648047, 2.005874, 1.781170, 1.563197, 1.998923, 1.741782, 1.516832, 2.092721, 0.355480, 1.643410, 1.368123, 0.573876, 1.762956, 0.822201, 1.826901, 1.084816, 1.099167, 1.943156, 1.895700, 1.591660, 1.901293, 2.365485, 1.483134, 1.772160, 1.460270, 1.496952, 1.645493, 1.641229, 1.510781, 1.698864, 1.193983, 1.761986, 1.303534, 1.250540, 1.773903, 0.795581, 1.557581, 0.862797, 1.773904, 1.783184, 1.683573, 0.788324, 1.323807, 1.796177, 1.854651, 1.089572, 0.538567, 1.570196, 1.220905, 2.030609, 0.556666, 1.535402, 0.432284, 1.713953, 1.227618, 1.586286, 1.031357, 1.725238, 1.426686, 1.377422, 0.599256, 1.124744, 1.709009, 1.623793, 1.625020, 1.363931, 1.526100, 1.422969, 1.913152, 1.191015, 1.299911, 1.599670, 0.609610, 1.633686, 1.551462, 1.370246, 1.611090, 1.763316, 1.806606, 0.844868, 2.569884, 0.402251, 1.560854, 1.435250, 1.527022, 1.562421, 1.944655, 0.847306, 0.602241, 1.729706, 1.121925, 1.773269, 1.338292, 1.170972, 1.089066, 1.659194, 1.182599, 1.688254, 1.989365, 1.110635, 1.750259, 0.797866, 1.385166, 1.543805, 1.318457, 0.765563, 0.517010, 0.623480, 2.081602, 0.996847, 0.897467, 1.746969, 1.213659, 1.121099, 1.576765, 1.537548, 1.484189, 1.271175, 0.887261, 1.556568, 1.445348, 0.739572, 1.449849, 1.003231, 1.429626, 1.856495, 1.335452, 1.517890, 0.665152, 2.255714, 1.357337, 1.287393, 1.331373, 1.312322, 1.702522, 0.550528, 2.162668, 2.124461, 2.311678, 0.388929, 1.903174, 1.358987, 0.596219, 1.785839, 1.680199, 1.570483, 1.173580, 1.697327, 1.504434, 1.092677, 0.437961, 0.520679, 1.948528, 1.590408, 1.994432, 1.547765, 1.439553, 1.457747, 0.526652, 1.012452, 1.498345, 1.543875, 1.378760, 1.813210, 2.096661, 1.159280, 1.131755, 0.967878, 0.832141, 1.631412, 0.888714, 1.546318, 1.785950, 2.061032, 1.233178, 0.746257, 1.655206, 1.599201, 2.010274, 1.478064, 1.469387, 1.997795, 0.852332, 1.897742, 1.004727, 1.493076, 1.161261, 1.558617, 1.595114, 0.542519, 1.079336, 0.703907, 0.946895, 0.869228, 1.608796, 1.811497, 1.040335, 1.748485, 1.768869, 1.347851, 1.584011, 1.582275, 1.548784, 1.644578, 1.573406, 1.679239, 1.928138, 0.898856, 1.375614, 1.722296, 1.124994, 1.509775, 1.210382, 1.011929, 1.069686, 1.821341, 1.760737, 1.594642, 1.230924, 1.223532, 0.321935, 1.536654, 1.199823, 1.583706, 2.037127, 1.483684, 1.372683, 1.308000, 1.506993, 2.027188, 1.336276, 1.154043, 1.315677, 2.111976, 1.137149, 1.901927, 1.525346, 1.128225, 1.476448, 1.506149, 1.022267, 1.277293, 1.677188, 1.478871, 1.528636, 1.188461, 1.252460, 1.482961, 0.735993, 0.512026, 1.542809, 1.459321, 1.618795, 0.602120, 0.528930, 2.139062, 1.700850, 2.125926, 1.193150, 0.788022, 1.512434, 1.585192, 1.920091, 2.149846, 1.579466, 1.610933, 1.768786, 1.587199, 1.201973, 0.521615, 1.619983, 1.856218, 1.593832, 2.304966, 1.532883, 1.030192, 1.402012, 1.878872, 1.525555, 1.219932, 1.125063, 1.683474, 0.635740, 1.210840, 0.445148, 1.859611, 1.719641, 1.444624, 1.141203, 0.522739, 0.601978, 0.784904, 1.898956, 0.512755, 0.474487, 0.598665, 1.562874, 1.506533, 1.592868, 0.540992, 1.913942, 2.095881, 0.506470, 1.889374, 1.774253, 1.426602, 1.334036, 1.863740, 1.501454, 1.403936, 0.775173, 1.749805, 1.057521, 0.837335, 1.550149, 1.539051, 1.529602, 1.102785, 1.758756, 1.052314, 1.487675, 1.370059, 1.277993, 1.484846, 1.560507, 1.203864, 1.017610, 1.219864, 1.941956, 1.976873, 2.137303, 1.697244, 0.472516, 0.371821, 1.490114, 1.039102, 1.778218, 1.752977, 0.645421, 1.624628, 1.389575, 0.521302, 1.207839, 1.734232, 1.483407, 1.247158, 1.592704, 1.169377, 1.020693, 1.488121, 0.406641, 1.353725, 1.710117, 1.159410, 1.913546, 1.558242, 0.845295, 2.078112, 0.389828, 1.849918, 1.380336, 0.505750, 1.499259, 1.598514, 1.498447, 1.634726, 1.751853, 1.663148, 1.652924, 1.625470, 2.029084, 1.829264, 2.310539, 1.593574, 1.596316, 1.720156, 1.004441, 0.876460, 0.986936, 1.255797, 1.312715, 1.197651, 1.883077, 1.245371, 2.437436, 2.173071, 1.609345, 1.766733, 1.981205, 0.359419, 1.866955, 1.513867, 2.096812, 0.408735, 1.813858, 1.872340, 1.555572, 1.624739, 1.145428, 0.803569, 2.092721, 1.197437, 1.854716, 1.368328, 0.916939, 1.400037, 1.413835, 1.202888, 1.169840, 1.645008, 1.778956, 1.662344, 1.592992, 1.189927, 1.714034, 1.773958, 1.924347, 1.640795, 1.505367, 2.367517, 1.497139, 1.697959, 1.705072, 1.773173, 0.824391, 2.086497, 1.381801, 1.226954, 1.959361, 1.833476, 0.858593, 1.697303, 1.704968, 1.866884, 1.096521, 1.633743, 1.766599, 1.382810, 1.446374, 1.161435, 1.228729, 0.389458, 1.157975, 1.863333, 1.989896, 1.841696, 0.343732, 1.445503, 1.769270, 1.356335, 0.495519, 1.608690, 1.251524, 1.103027, 2.062964, 0.548244, 1.150777, 1.696269, 0.370591, 1.988754, 1.499364, 1.512619, 1.470615, 2.453020, 1.220156, 1.548343, 1.403593, 0.960423, 1.670351, 1.263547, 1.554360, 1.935296, 1.715339, 1.724165, 0.911869, 0.298018, 1.551034, 1.490984, 1.807197, 1.908613, 1.513383, 2.124620, 1.483942, 0.644660, 1.883992, 1.024458, 1.695267, 1.017464, 0.613991, 1.553525, 1.626559, 1.771532, 0.931601, 1.585059, 0.507685, 1.474176, 1.287999, 1.515128, 0.540611, 1.515776, 1.127547, 1.869389, 1.218819, 1.320742, 0.516770, 1.565544, 1.514461, 2.484575, 0.837088, 1.066703, 1.328585, 1.691931, 1.506269, 0.502054, 1.493657, 0.520225, 1.516829, 1.240947, 1.232074, 1.712834, 1.843081, 0.494476, 0.488819, 1.162850, 1.615954, 1.851078, 1.604658, 1.373180, 1.493048, 1.930687, 1.576555, 1.719398, 1.895867, 1.238472, 1.520209, 1.712210, 1.449156, 1.400541, 2.051561, 1.271454, 1.646794, 1.138911, 1.614759, 1.936174, 1.465231, 1.822198, 1.363892, 1.335866, 1.214921, 1.173008, 1.719918, 0.368222, 1.069556, 1.930283, 1.464259, 1.119756, 1.465852, 2.024013, 1.850827, 1.692713, 1.226407, 1.750562, 1.560261, 1.269093, 0.934317, 1.784916, 1.631784, 1.564840, 0.456529, 1.100256, 0.269323, 1.850564, 0.873839, 1.011976, 0.947115, 2.087725, 1.596591, 1.594354, 1.626598, 1.299617, 1.872905, 1.465709, 1.182330, 0.531668, 1.012711, 1.811800, 1.213185, 1.742432, 0.482635, 1.507386, 1.705631, 1.530319, 1.561019, 1.743296, 1.240140, 1.451795, 1.097794, 0.434922, 1.686489, 1.757992, 1.617656, 1.655116, 1.476563, 1.267988, 1.604897, 1.502390, 1.710629, 1.735852, 1.515883, 1.820624, 1.262980, 1.312755, 0.888939, 0.884789, 2.019280, 1.681263, 0.908370, 1.636196, 2.113583, 1.225824, 1.708062, 1.969349, 1.318559, 1.510101, 1.636959, 2.153252, 0.332775, 1.407178, 1.892862, 2.120915, 2.321878, 1.358479, 1.557243, 1.075435, 1.521303, 0.585582, 1.215612, 1.593100, 1.967783, 1.595135, 1.524945, 1.079458, 1.621807, 1.132076, 1.586299, 0.568758, 1.956674, 1.615483, 1.603360, 1.183302, 1.746932, 1.443972, 0.953094, 1.509914, 1.978504, 1.572933, 1.687727, 1.475002, 0.315324, 1.141410, 1.593967, 1.526234, 2.034265, 2.142834, 2.234516, 1.341387, 1.916024, 1.453212, 1.226520, 0.790460, 1.698039, 1.621321, 0.362571, 1.028216, 0.574951, 1.514545, 0.498540, 1.743672, 1.665717, 1.223173, 1.229269, 1.750948, 1.650233, 1.672066, 1.656325, 1.949590, 2.209838, 1.648005, 1.036061, 1.553926, 2.069471, 1.285725, 1.331509, 2.219819, 0.461467, 1.751200, 1.526908, 1.369564, 0.678546, 1.149745, 1.696711, 1.795919, 1.512365, 1.401837, 1.542781, 1.361319, 1.603690, 1.495703, 1.497179, 1.776709, 1.322304, 1.416982, 0.548303, 1.097828, 1.054489, 2.235797, 1.245268, 1.748897, 1.617800, 1.472694, 1.714215, 1.538451, 2.034420, 1.098861, 0.830816, 1.087964, 1.483503, 1.614253, 1.259827, 1.165151, 0.720584, 0.633641, 1.788114, 2.386915, 2.171055, 1.523129, 1.394621, 1.160125, 1.481806, 0.891949, 0.536648, 1.550033, 2.075619, 0.991499, 1.459754, 1.522729, 1.903969, 1.297039, 1.159718, 1.084554, 1.649192, 1.519105, 1.690127, 1.565883, 1.462768, 1.542214, 1.088707, 0.953003, 2.001620, 1.854833, 1.263186, 0.382545, 1.381184, 1.471637, 0.541800, 1.630637, 1.910889, 2.149211, 1.204344, 1.403224, 1.356523, 1.755970, 1.440331, 1.644127, 2.028678, 1.762944, 1.610919, 1.200260, 1.201154, 0.825765, 1.571024, 1.536277, 1.668885, 2.106913, 0.557164, 2.372129, 2.379236, 1.415378, 1.657222, 1.604187, 1.571723, 1.621112, 1.558298, 1.539890, 1.498433, 1.353520, 1.563240, 1.684488, 1.588615, 1.497382, 1.928021, 1.856328, 0.765129, 1.705889, 1.204414, 0.937382, 2.221437, 0.822248, 1.232157, 1.337144, 1.446933, 1.694659, 1.753309, 0.819080, 0.940823, 1.773718, 1.566627, 0.318749, 1.600319, 1.179167, 0.740170, 0.376508, 1.152330, 1.831083, 1.158150, 0.896163, 1.658467, 1.216095, 1.710947, 1.600738, 1.429453, 0.605365, 1.559101, 1.631869, 1.511622, 1.595905, 1.207139, 1.768956, 1.924092, 1.612269, 1.621009, 1.300866, 1.164987, 1.175617, 1.517633, 1.679513, 2.415429, 1.055539, 1.562567, 1.137367, 1.021426, 1.645471, 1.553499, 2.149060, 1.673116, 1.213608, 1.814032, 1.604052, 1.699634, 1.713157, 1.113967, 1.159600, 1.679484, 1.435928, 1.652632, 1.269848, 0.497007, 1.086234, 1.537090, 1.205788, 1.868988, 1.617210, 1.619431, 1.538925, 0.853591, 1.588170, 0.506064, 1.652308, 0.657603, 1.827882, 1.872696, 1.613630, 1.613437, 1.741495, 2.412999, 2.263592, 1.606960, 1.385170, 1.452368, 1.805744, 1.211291, 0.810508, 1.546760, 1.492764, 1.077645, 1.535912, 1.626168, 1.870311, 1.949117, 0.498114, 1.574616, 1.693082, 1.765962, 0.828089, 1.564501, 1.310799, 0.819431, 1.981297, 1.707773, 1.956640, 1.849669, 1.776876, 0.811122, 1.595968, 1.422287, 1.504783, 1.471981, 1.699262, 1.860042, 1.655185, 1.627180, 1.086573, 1.522266, 1.745384, 0.708868, 1.835404, 1.869814, 1.097745, 1.748215, 1.689104, 1.094763, 1.813719, 1.978672, 1.150895, 1.627704, 1.548431, 1.219725, 1.198931, 2.377989, 1.968701, 1.476834, 1.569020, 1.816334, 1.092023, 2.019742, 1.979805, 1.603440, 1.714670, 1.506108, 1.316119, 1.615156, 0.816839, 1.523170, 1.408592, 1.564504, 1.468942, 1.935141, 1.742605, 1.480504, 1.741523, 1.395359, 1.531433, 2.149762, 2.194885, 0.968754, 1.487113, 1.537558, 1.133872, 0.502038, 1.613902, 1.718718, 1.241865, 1.347541, 1.284764, 1.372939, 1.524205, 1.631268, 1.461217, 0.542148, 1.293850, 0.614199, 1.891091, 1.175451, 1.650690, 1.115479, 1.714955, 1.894769, 0.500054, 0.685786, 1.953573, 1.809301, 0.306871, 0.659295, 1.657702, 1.202282, 0.511544, 1.699053, 1.675886, 1.430237, 1.884640, 1.442770, 1.346159, 1.745995, 0.792505, 1.784818, 1.687063, 1.870889, 1.757685, 0.483603, 0.516492, 1.502404, 1.347113, 1.352927, 1.307132, 1.888127, 1.801867, 1.963863, 1.609545, 1.350890, 1.656073, 1.247369, 1.997902, 0.712533, 1.590803, 1.458195, 1.474134, 1.918328, 1.648166, 1.511446, 1.967484, 1.678157, 0.639148, 1.460388, 1.594416, 2.069592, 1.986233, 0.507355, 1.621857, 1.787167, 1.502261, 0.543799, 0.535898, 1.208663, 1.878899, 1.791845, 1.002890, 0.839760, 1.484271, 1.211083, 1.067177, 1.703020, 1.032461, 1.101248, 1.599835, 1.614271, 0.614613, 1.467720, 1.510808, 1.961035, 1.083906, 0.544079, 1.827064, 1.849764, 1.131096, 2.093355, 1.777390, 1.038194, 1.589878, 1.403207, 0.999898, 2.123925, 1.951173, 2.065741, 0.870871, 1.595936, 2.189736, 1.614603, 1.387329, 1.893629, 0.784964, 0.512211, 0.578986, 1.978142, 2.151248, 1.586817, 1.616659, 0.921520, 0.868900, 0.396033, 0.886073, 1.462070, 2.080229, 1.778499, 1.094697, 1.697580, 1.159798, 0.786006, 1.327701, 1.616861, 1.685357, 1.612186, 1.097082, 1.915432, 1.623794, 1.944531, 1.675742, 1.026611, 1.903434, 1.457787, 0.544545, 1.981540, 1.632973, 1.327315, 1.334348, 1.625562, 1.480100, 1.471120, 1.394057, 0.631246, 1.488036, 1.626654, 1.288149, 1.859394, 1.516780, 1.625296, 0.767925, 2.082785, 0.793327, 0.514613, 1.169912, 1.724121, 2.006128, 1.853355, 0.382393, 1.410220, 1.337826, 2.256923, 1.532884, 1.455534, 1.867832, 2.025718, 0.496323, 2.132871, 1.608152, 1.708591, 2.006747, 1.994377, 1.253077, 1.960900, 1.539538, 1.701513, 1.501431, 2.118337, 1.878959, 1.506969, 1.729198, 1.635720, 1.543412, 1.768097, 1.375311, 1.733149, 1.386952, 2.097047, 1.879706, 1.649102, 0.817671, 1.714171, 1.310953, 0.777583, 0.910428, 1.019963, 1.002423, 1.415999, 1.176053, 1.382865, 1.343700, 1.329194, 1.557610, 1.641548, 0.543472, 0.848392, 1.551312, 1.628702, 0.545262, 2.079090, 0.869159, 1.384267, 1.489454, 1.613789, 2.063811, 0.603126, 1.837314, 0.396118, 1.335311, 1.191134, 0.504583, 0.830549, 1.295153, 1.515608, 1.436582, 1.469677, 2.037398, 1.973079, 2.157582, 1.625495, 1.554380, 1.702430, 1.451434, 0.517255, 1.521674, 1.415572, 1.607982, 1.567527, 0.898187, 1.468145, 1.228971, 1.236984, 1.695563, 1.463084, 0.868063, 2.211969, 0.357028, 0.737736, 1.051622, 1.471189, 1.073446, 1.678645, 1.109845, 2.057920, 1.291084, 1.591007, 1.541431, 1.471457, 1.077749, 0.365739, 1.156220, 1.542925, 1.454802, 2.049403, 1.945586, 0.426159, 1.829930, 1.498234, 0.695640, 1.420518, 1.677373, 1.395524, 1.475934, 1.815549, 2.002370, 1.612015, 1.216516, 0.933904, 1.314148, 1.531192, 1.102305, 1.744348, 0.337483, 1.192185, 0.915678, 1.740436, 1.545352, 0.867318, 1.750611, 1.815053, 1.595609, 0.397964, 1.013249, 1.411355, 1.272680, 1.177844, 1.470023, 0.347802, 0.528510, 1.201689, 1.201823, 1.506217, 1.458649, 0.313409, 1.595364, 1.551422, 1.633323, 2.012793, 1.807963, 1.635964, 1.120293, 1.300846, 0.508170, 1.236224, 1.758050, 0.937170, 0.574690, 1.462327, 1.025984, 1.573766, 1.543220, 1.508527, 1.570577, 1.478617, 2.247222, 1.559380, 1.795870, 1.883738, 1.530771, 1.198309, 1.868667, 0.927810, 1.196406, 0.509205, 1.704442, 0.850489, 1.534493, 1.194077, 1.817248, 2.151226, 1.626265, 1.426552, 0.483690, 1.460791, 1.577554, 1.867910, 1.937795, 1.605490, 1.179157, 0.811063, 0.777183, 1.528543, 1.973027, 1.564354, 1.877029, 1.594216, 1.153291, 1.511111, 1.185190, 1.230962, 1.074757, 1.645648, 0.577437, 1.657952, 1.816025, 1.269269, 1.703639, 1.626544, 2.020387, 2.130925, 2.123267, 1.644599, 2.065418, 1.875356, 1.674649, 1.682498, 1.536284, 1.979836, 0.409903, 1.695277, 2.535636, 0.916790, 1.685009, 1.571490, 0.825669, 1.623790, 1.305521, 1.537003, 1.084352, 0.788869, 1.169201, 1.570858, 0.924286, 0.999826, 0.797072, 0.435127, 1.540923, 1.170351, 1.621868, 1.460770, 2.006160, 1.918535, 1.745061, 1.616873, 1.587706, 1.632854, 0.698973, 1.289471, 1.610021, 1.721836, 0.397820, 0.901108, 2.375931, 1.607665, 1.578828, 1.319594, 2.112954, 1.587496, 0.517340, 1.945445, 1.632746, 1.640345, 2.395244, 0.541666
                                     };

int hardpoints1[4674] = {

4, 2, 6, 2, 4, 4, 6, 6, 4, 2, 6, 0, 6, 0, 2, 4, 0, 2, 1, 7, 1, 0, 1, 7, 0, 2, 3, 6, 5, 6, 7, 0, 6, 6, 3, 7, 7, 4, 
2, 5, 5, 7, 7, 7, 7, 3, 0, 7, 2, 1, 4, 3, 3, 7, 3, 4, 4, 5, 4, 5, 2, 2, 5, 6, 6, 6, 6, 3, 4, 2, 0, 0, 1, 7, 1, 6, 5, 2, 1, 3, 7, 2, 1, 
6, 3, 1, 5, 3, 2, 0, 3, 2, 4, 5, 1, 2, 5, 1, 3, 4, 2, 3, 3, 1, 1, 4, 4, 3, 6, 2, 4, 4, 3, 0, 4, 6, 5, 2, 0, 2, 5, 6, 7, 2, 7, 3, 1, 3, 
0, 4, 6, 6, 4, 1, 1, 7, 5, 6, 4, 6, 6, 2, 5, 6, 2, 2, 3, 1, 7, 5, 7, 1, 0, 2, 1, 6, 4, 1, 1, 1, 1, 5, 0, 0, 5, 5, 7, 1, 2, 4, 6, 1, 5, 
3, 2, 1, 0, 5, 7, 4, 1, 6, 5, 6, 0, 2, 4, 6, 0, 0, 0, 0, 7, 7, 4, 1, 2, 0, 2, 4, 7, 1, 6, 5, 7, 7, 2, 3, 2, 7, 5, 5, 6, 5, 6, 2, 6, 4, 
7, 0, 3, 1, 1, 4, 7, 5, 3, 3, 0, 3, 2, 3, 1, 1, 4, 5, 3, 5, 7, 1, 4, 0, 6, 3, 7, 0, 0, 7, 7, 7, 0, 7, 6, 0, 4, 0, 0, 3, 7, 7, 4, 1, 5, 
2, 6, 0, 4, 7, 4, 5, 5, 4, 0, 7, 6, 3, 2, 0, 5, 2, 4, 7, 0, 5, 0, 0, 1, 5, 1, 7, 6, 1, 1, 0, 1, 7, 7, 5, 5, 7, 1, 0, 5, 2, 7, 5, 3, 1, 
7, 0, 6, 6, 6, 2, 0, 3, 5, 5, 7, 2, 6, 1, 6, 3, 5, 3, 7, 1, 0, 2, 6, 1, 3, 4, 7, 6, 2, 7, 6, 5, 5, 2, 2, 3, 7, 0, 7, 2, 3, 6, 5, 5, 0, 
4, 1, 4, 3, 2, 2, 6, 4, 0, 1, 7, 7, 2, 0, 2, 7, 4, 7, 7, 3, 2, 4, 0, 0, 7, 5, 2, 3, 4, 0, 4, 6, 4, 1, 1, 3, 5, 6, 4, 5, 4, 6, 4, 5, 0, 
1, 5, 0, 7, 0, 1, 6, 7, 5, 6, 5, 0, 5, 5, 1, 6, 6, 3, 1, 1, 2, 3, 2, 2, 3, 3, 3, 6, 4, 2, 1, 4, 1, 2, 0, 7, 5, 6, 0, 7, 5, 6, 3, 6, 6, 
1, 0, 0, 5, 6, 7, 7, 1, 6, 2, 1, 7, 0, 1, 7, 4, 3, 5, 6, 0, 4, 6, 4, 1, 2, 6, 4, 2, 1, 1, 1, 6, 3, 2, 1, 7, 5, 4, 7, 4, 2, 4, 6, 6, 2, 
4, 3, 1, 6, 6, 1, 4, 1, 6, 3, 2, 5, 5, 7, 3, 5, 3, 1, 4, 1, 2, 4, 6, 2, 3, 7, 2, 1, 0, 6, 1, 6, 4, 7, 5, 2, 0, 7, 5, 7, 4, 4, 2, 1, 1, 
7, 4, 7, 7, 5, 5, 4, 0, 2, 1, 1, 0, 7, 7, 3, 4, 2, 3, 1, 0, 1, 4, 4, 5, 0, 5, 5, 7, 0, 1, 7, 3, 3, 4, 3, 5, 3, 5, 1, 4, 5, 4, 0, 5, 3, 
1, 7, 3, 4, 3, 6, 4, 1, 3, 2, 3, 7, 6, 3, 5, 5, 0, 4, 4, 0, 2, 5, 5, 5, 2, 5, 7, 7, 1, 3, 7, 3, 4, 3, 6, 3, 1, 4, 0, 0, 4, 3, 3, 6, 0, 
7, 5, 2, 1, 0, 2, 0, 2, 2, 1, 6, 0, 4, 5, 6, 5, 4, 1, 4, 2, 2, 1, 4, 4, 6, 2, 3, 1, 0, 4, 6, 7, 4, 6, 0, 3, 3, 1, 0, 6, 7, 1, 0, 6, 0, 
0, 6, 5, 4, 0, 6, 3, 1, 7, 5, 7, 5, 0, 2, 1, 0, 7, 0, 2, 0, 5, 7, 4, 1, 7, 3, 0, 4, 7, 5, 4, 6, 6, 6, 6, 5, 4, 3, 1, 0, 2, 7, 3, 6, 7, 
5, 3, 6, 1, 2, 2, 0, 1, 7, 5, 4, 1, 6, 1, 1, 1, 2, 7, 4, 6, 2, 2, 0, 4, 0, 3, 5, 6, 3, 0, 5, 1, 7, 2, 7, 4, 3, 3, 1, 4, 4, 1, 3, 4, 1, 
0, 7, 4, 5, 3, 6, 4, 4, 5, 4, 2, 7, 1, 1, 3, 5, 5, 3, 1, 1, 6, 0, 5, 4, 1, 4, 0, 0, 1, 7, 7, 2, 5, 0, 5, 1, 3, 4, 3, 0, 6, 4, 4, 0, 4, 
2, 3, 1, 6, 3, 0, 3, 6, 4, 5, 5, 1, 4, 0, 2, 2, 1, 0, 5, 7, 6, 0, 0, 1, 0, 2, 5, 2, 2, 2, 0, 7, 5, 3, 3, 2, 4, 6, 3, 7, 3, 2, 0, 0, 0, 
5, 5, 4, 2, 2, 4, 2, 6, 1, 4, 6, 6, 1, 3, 7, 4, 5, 7, 6, 3, 5, 2, 5, 3, 0, 6, 2, 5, 2, 5, 2, 6, 5, 7, 4, 0, 5, 4, 1, 6, 3, 6, 3, 7, 0, 
0, 0, 1, 3, 3, 0, 6, 4, 6, 0, 0, 5, 3, 7, 7, 3, 7, 7, 0, 0, 5, 2, 5, 4, 1, 5, 2, 2, 2, 3, 1, 2, 5, 3, 3, 2, 4, 5, 1, 4, 6, 4, 2, 3, 4, 
1, 0, 3, 2, 1, 3, 2, 4, 3, 5, 0, 3, 0, 2, 1, 6, 3, 5, 3, 5, 6, 4, 5, 4, 7, 7, 1, 0, 1, 6, 6, 2, 2, 6, 6, 1, 7, 2, 4, 5, 6, 3, 2, 6, 3, 
7, 3, 3, 3, 5, 3, 4, 7, 0, 4, 0, 4, 5, 7, 4, 3, 2, 4, 3, 1, 7, 0, 1, 5, 7, 6, 6, 3, 3, 1, 0, 2, 2, 1, 5, 6, 2, 4, 2, 0, 4, 1, 5, 0, 0, 
3, 3, 6, 5, 2, 2, 2, 4, 0, 1, 0, 4, 6, 3, 2, 5, 5, 2, 7, 5, 2, 5, 2, 3, 2, 2, 2, 6, 6, 0, 5, 5, 3, 3, 5, 7, 2, 7, 6, 0, 1, 3, 5, 1, 5, 
6, 2, 7, 5, 2, 3, 4, 0, 5, 5, 7, 3, 1, 5, 7, 5, 2, 5, 3, 7, 5, 4, 4, 6, 3, 1, 4, 3, 5, 3, 4, 2, 3, 5, 7, 0, 3, 1, 3, 4, 1, 4, 5, 3, 7, 
1, 0, 1, 1, 5, 5, 4, 1, 3, 7, 7, 7, 2, 0, 3, 1, 2, 3, 3, 3, 4, 6, 4, 2, 2, 3, 0, 6, 7, 4, 2, 4, 0, 4, 0, 3, 7, 4, 6, 6, 7, 0, 3, 2, 1, 
1, 2, 4, 0, 1, 6, 2, 5, 0, 3, 3, 3, 1, 3, 2, 2, 1, 4, 2, 5, 1, 6, 5, 7, 1, 4, 0, 7, 0, 6, 4, 3, 4, 3, 1, 0, 3, 1, 2, 5, 1, 2, 3, 6, 1, 
5, 0, 0, 2, 2, 7, 6, 5, 7, 0, 0, 1, 6, 6, 7, 1, 2, 0, 3, 2, 7, 0, 4, 5, 6, 0, 4, 2, 1, 5, 6, 5, 4, 6, 7, 1, 1, 3, 7, 2, 5, 2, 4, 6, 2, 
3, 4, 1, 0, 0, 3, 6, 6, 4, 4, 1, 7, 2, 3, 4, 0, 6, 2, 4, 7, 4, 1, 7, 2, 1, 0, 5, 7, 0, 0, 5, 2, 3, 6, 6, 1, 6, 5, 1, 1, 4, 7, 4, 0, 6, 
7, 0, 4, 4, 4, 3, 4, 4, 4, 0, 6, 2, 4, 7, 5, 2, 4, 3, 6, 3, 4, 3, 6, 7, 3, 3, 7, 3, 0, 4, 7, 4, 4, 6, 3, 2, 0, 5, 4, 3, 0, 4, 5, 1, 1, 
1, 4, 6, 3, 0, 4, 5, 6, 1, 0, 3, 2, 7, 1, 6, 5, 2, 3, 3, 4, 2, 2, 6, 1, 4, 5, 5, 2, 1, 6, 7, 0, 4, 4, 4, 0, 4, 7, 3, 5, 5, 2, 7, 2, 7, 
0, 6, 4, 6, 2, 6, 6, 6, 2, 6, 7, 7, 6, 7, 6, 0, 5, 3, 0, 7, 5, 2, 4, 2, 0, 5, 6, 0, 5, 2, 6, 6, 2, 1, 6, 3, 3, 3, 0, 0, 5, 3, 3, 0, 0, 
7, 4, 6, 5, 6, 3, 5, 0, 5, 0, 7, 2, 3, 2, 7, 5, 6, 4, 7, 5, 4, 7, 3, 5, 0, 0, 1, 4, 2, 1, 2, 7, 3, 6, 0, 1, 4, 2, 7, 2, 7, 1, 6, 2, 3, 
0, 1, 4, 3, 5, 4, 1, 2, 7, 7, 0, 4, 0, 6, 7, 2, 4, 4, 1, 7, 5, 6, 7, 1, 2, 0, 4, 3, 5, 6, 1, 6, 2, 2, 6, 4, 6, 5, 5, 3, 4, 5, 0, 7, 1, 
4, 4, 5, 6, 0, 5, 3, 1, 1, 2, 2, 6, 5, 1, 2, 4, 5, 5, 0, 4, 4, 4, 1, 6, 2, 4, 5, 2, 6, 1, 0, 1, 3, 4, 5, 2, 6, 7, 3, 2, 3, 3, 1, 6, 6, 
0, 6, 6, 4, 7, 7, 6, 6, 5, 1, 1, 2, 7, 5, 7, 3, 4, 7, 6, 3, 1, 5, 0, 3, 5, 1, 7, 1, 2, 4, 2, 7, 5, 0, 7, 0, 0, 1, 3, 0, 5, 5, 4, 0, 2, 
0, 1, 6, 0, 1, 2, 4, 7, 3, 2, 2, 6, 6, 5, 0, 3, 4, 7, 0, 2, 4, 3, 2, 6, 6, 5, 4, 2, 7, 0, 6, 1, 7, 4, 3, 7, 3, 2, 2, 5, 3, 7, 1, 4, 4, 
5, 2, 2, 0, 7, 2, 5, 5, 2, 3, 0, 7, 4, 5, 5, 2, 5, 6, 7, 6, 4, 1, 7, 1, 3, 7, 5, 7, 7, 4, 3, 4, 7, 3, 0, 6, 2, 3, 4, 0, 0, 1, 6, 2, 1, 
5, 5, 1, 4, 5, 5, 7, 3, 1, 1, 6, 1, 7, 7, 1, 3, 2, 2, 5, 2, 4, 3, 4, 7, 5, 0, 7, 4, 1, 2, 5, 3, 6, 2, 4, 3, 2, 5, 2, 2, 2, 5, 7, 4, 3, 
2, 3, 4, 6, 1, 4, 5, 7, 5, 2, 5, 6, 3, 2, 6, 4, 5, 3, 1, 5, 0, 4, 6, 7, 3, 4, 3, 7, 0, 1, 0, 4, 3, 6, 1, 5, 2, 3, 0, 2, 7, 5, 6, 1, 7, 
1, 3, 5, 3, 0, 1, 7, 1, 5, 7, 0, 0, 3, 1, 5, 0, 4, 4, 0, 2, 7, 3, 2, 0, 0, 5, 4, 2, 1, 2, 0, 3, 5, 3, 6, 2, 0, 1, 5, 0, 2, 5, 5, 5, 4, 
5, 1, 3, 3, 2, 5, 4, 6, 2, 4, 7, 5, 3, 3, 6, 1, 4, 1, 3, 3, 3, 5, 3, 3, 1, 0, 1, 1, 1, 3, 0, 6, 0, 5, 1, 6, 5, 2, 6, 1, 1, 1, 3, 1, 3, 
5, 4, 5, 4, 1, 3, 1, 2, 7, 2, 6, 4, 0, 5, 3, 3, 5, 2, 1, 5, 4, 0, 3, 0, 6, 3, 1, 0, 0, 4, 7, 2, 3, 6, 3, 4, 1, 3, 4, 1, 3, 6, 2, 3, 2, 
2, 4, 2, 2, 4, 7, 0, 1, 5, 1, 5, 4, 3, 3, 6, 6, 0, 7, 6, 4, 1, 2, 6, 4, 2, 1, 5, 5, 3, 4, 4, 6, 7, 5, 1, 6, 6, 5, 5, 0, 5, 1, 5, 7, 7, 
4, 2, 1, 3, 3, 4, 6, 3, 7, 7, 7, 7, 6, 1, 4, 3, 6, 6, 5, 3, 3, 6, 1, 3, 3, 7, 3, 2, 1, 0, 3, 6, 6, 4, 6, 0, 7, 0, 2, 2, 1, 6, 5, 3, 2, 
7, 3, 2, 3, 2, 5, 4, 6, 4, 2, 5, 5, 2, 5, 6, 2, 4, 4, 6, 1, 2, 3, 7, 0, 1, 1, 6, 2, 4, 1, 4, 6, 3, 7, 6, 6, 6, 5, 4, 4, 1, 2, 5, 3, 1, 
5, 0, 1, 5, 5, 7, 5, 5, 1, 1, 0, 5, 2, 6, 6, 3, 2, 4, 7, 0, 5, 4, 0, 5, 1, 2, 0, 3, 1, 4, 1, 1, 1, 0, 4, 5, 0, 7, 0, 5, 6, 5, 0, 7, 3, 
3, 7, 2, 7, 7, 6, 5, 7, 2, 7, 0, 3, 2, 7, 5, 1, 4, 1, 6, 7, 1, 2, 0, 7, 1, 5, 0, 6, 2, 2, 7, 3, 4, 1, 7, 1, 1, 0, 7, 0, 4, 6, 7, 0, 6, 
4, 2, 3, 0, 3, 1, 5, 1, 0, 4, 2, 7, 1, 4, 1, 6, 5, 4, 7, 0, 5, 4, 3, 3, 4, 1, 0, 7, 5, 5, 6, 3, 6, 2, 6, 2, 7, 5, 2, 0, 4, 0, 5, 1, 0, 
3, 1, 7, 4, 3, 6, 3, 1, 5, 0, 4, 1, 3, 0, 1, 6, 0, 7, 2, 1, 1, 1, 0, 1, 5, 1, 1, 0, 7, 3, 1, 5, 3, 4, 5, 2, 6, 4, 2, 0, 0, 1, 4, 1, 1, 
4, 3, 2, 1, 4, 2, 0, 7, 3, 5, 5, 6, 4, 6, 3, 5, 1, 2, 6, 3, 3, 6, 3, 7, 5, 0, 4, 3, 4, 2, 6, 3, 0, 3, 5, 2, 1, 5, 6, 7, 0, 5, 6, 5, 7, 
7, 5, 2, 3, 5, 6, 5, 4, 3, 2, 7, 1, 0, 1, 6, 3, 0, 0, 7, 7, 1, 5, 7, 3, 5, 0, 3, 4, 0, 4, 2, 2, 4, 1, 5, 3, 6, 0, 0, 1, 6, 1, 3, 7, 2, 
4, 3, 7, 0, 7, 5, 6, 4, 6, 7, 4, 1, 1, 2, 3, 7, 0, 7, 4, 4, 3, 3, 4, 2, 7, 0, 1, 3, 6, 5, 4, 5, 6, 2, 0, 7, 7, 0, 3, 4, 2, 3, 1, 1, 5, 
0, 7, 7, 1, 5, 1, 3, 4, 3, 7, 7, 3, 3, 7, 7, 4, 1, 0, 5, 2, 4, 7, 6, 4, 7, 5, 6, 2, 3, 7, 5, 4, 2, 0, 6, 2, 2, 4, 6, 6, 5, 3, 7, 1, 6, 
4, 1, 6, 5, 3, 5, 3, 3, 6, 6, 5, 2, 0, 0, 0, 1, 2, 5, 5, 6, 3, 3, 0, 7, 7, 1, 4, 0, 6, 0, 5, 7, 0, 0, 4, 6, 4, 2, 3, 6, 6, 4, 5, 6, 2, 
3, 7, 2, 5, 6, 2, 6, 4, 4, 0, 7, 5, 1, 7, 6, 1, 2, 3, 2, 1, 5, 5, 0, 5, 1, 2, 0, 7, 4, 3, 5, 6, 5, 5, 1, 0, 4, 3, 1, 1, 0, 2, 0, 6, 4, 
5, 4, 2, 0, 7, 6, 2, 3, 2, 1, 0, 2, 5, 0, 2, 2, 0, 1, 6, 3, 3, 7, 5, 0, 0, 6, 5, 7, 7, 0, 7, 2, 0, 1, 3, 3, 5, 5, 7, 2, 3, 0, 1, 6, 4, 
2, 4, 2, 1, 3, 3, 7, 1, 1, 4, 2, 7, 5, 1, 6, 6, 1, 1, 7, 4, 0, 7, 1, 7, 4, 0, 6, 4, 4, 3, 7, 5, 1, 5, 1, 1, 5, 4, 1, 4, 3, 5, 0, 5, 0, 
3, 5, 5, 5, 1, 0, 6, 4, 5, 6, 4, 7, 2, 0, 0, 7, 5, 1, 7, 2, 6, 6, 0, 0, 1, 2, 6, 3, 6, 5, 3, 0, 7, 4, 6, 1, 0, 6, 0, 6, 0, 4, 4, 1, 5, 
3, 7, 4, 7, 6, 7, 2, 0, 0, 0, 5, 3, 7, 3, 2, 0, 4, 7, 1, 2, 5, 3, 7, 2, 1, 4, 2, 5, 2, 0, 6, 0, 1, 4, 7, 5, 1, 1, 4, 6, 6, 5, 7, 0, 1, 
6, 3, 4, 5, 5, 4, 7, 5, 6, 7, 3, 2, 2, 2, 1, 3, 0, 3, 5, 7, 4, 0, 3, 3, 0, 0, 4, 2, 1, 4, 3, 3, 0, 5, 5, 6, 1, 5, 0, 7, 7, 2, 4, 1, 6, 
6, 6, 6, 2, 6, 7, 6, 1, 3, 5, 0, 7, 4, 0, 0, 6, 4, 2, 6, 1, 3, 4, 6, 5, 6, 4, 1, 2, 2, 0, 2, 2, 6, 5, 5, 7, 7, 1, 7, 4, 6, 3, 3, 3, 2, 
6, 1, 3, 5, 4, 0, 7, 6, 4, 5, 7, 4, 2, 6, 4, 7, 1, 4, 4, 3, 3, 4, 4, 4, 7, 7, 2, 4, 3, 1, 4, 6, 4, 4, 1, 2, 0, 2, 1, 0, 5, 6, 7, 0, 3, 
6, 7, 1, 0, 3, 2, 1, 3, 5, 4, 2, 3, 7, 2, 1, 0, 0, 7, 6, 1, 5, 1, 3, 0, 4, 5, 6, 3, 5, 3, 2, 7, 4, 0, 5, 5, 3, 6, 2, 4, 3, 1, 7, 1, 4, 
0, 3, 2, 7, 3, 5, 3, 4, 5, 7, 4, 2, 0, 1, 4, 4, 4, 3, 5, 7, 2, 0, 1, 5, 0, 6, 0, 4, 5, 0, 5, 2, 1, 6, 0, 0, 3, 6, 4, 0, 6, 7, 5, 5, 1, 
5, 0, 2, 6, 0, 4, 7, 0, 0, 0, 5, 4, 4, 7, 4, 5, 1, 3, 4, 6, 1, 5, 4, 1, 1, 5, 2, 1, 0, 6, 4, 2, 6, 0, 6, 0, 3, 7, 1, 4, 0, 6, 6, 7, 0, 
0, 1, 0, 0, 0, 6, 5, 1, 4, 2, 4, 0, 0, 6, 3, 4, 0, 4, 3, 6, 0, 5, 4, 3, 6, 4, 1, 7, 5, 5, 4, 1, 7, 6, 1, 3, 1, 3, 5, 1, 2, 7, 2, 2, 6, 
0, 5, 7, 0, 5, 4, 7, 0, 0, 2, 2, 2, 7, 3, 3, 3, 4, 2, 5, 7, 1, 1, 0, 6, 7, 2, 4, 6, 5, 6, 5, 3, 0, 7, 7, 0, 3, 3, 2, 7, 5, 6, 2, 3, 0, 
2, 5, 1, 7, 4, 0, 7, 7, 5, 2, 2, 2, 2, 4, 3, 7, 0, 0, 6, 6, 1, 3, 3, 1, 7, 2, 4, 3, 4, 6, 5, 0, 7, 1, 7, 6, 7, 2, 2, 5, 6, 6, 1, 5, 2, 
7, 0, 4, 2, 5, 3, 5, 2, 3, 5, 4, 0, 0, 3, 2, 3, 6, 7, 1, 7, 1, 5, 6, 4, 0, 6, 6, 6, 3, 1, 5, 2, 7, 1, 5, 5, 2, 7, 1, 0, 7, 3, 2, 3, 1, 
1, 0, 6, 1, 6, 0, 5, 7, 6, 1, 7, 7, 2, 2, 3, 5, 7, 0, 1, 5, 3, 6, 4, 5, 2, 4, 1, 3, 2, 2, 1, 6, 1, 6, 1, 0, 3, 1, 2, 2, 0, 7, 1, 1, 2, 
4, 4, 6, 0, 3, 6, 4, 6, 1, 3, 3, 4, 2, 0, 6, 7, 0, 5, 7, 0, 5, 3, 0, 5, 7, 7, 2, 0, 1, 5, 6, 7, 3, 1, 2, 6, 3, 2, 0, 6, 0, 5, 6, 4, 0, 
1, 2, 0, 0, 3, 0, 1, 3, 0, 6, 3, 4, 1, 2, 0, 5, 5, 5, 4, 4, 0, 3, 6, 7, 0, 7, 4, 0, 7, 2, 1, 1, 5, 3, 1, 0, 7, 5, 4, 6, 7, 2, 7, 0, 4, 
3, 6, 4, 5, 3, 6, 3, 6, 4, 2, 7, 1, 3, 2, 7, 7, 4, 2, 6, 5, 2, 5, 3, 6, 4, 6, 7, 7, 0, 3, 4, 7, 6, 0, 7, 4, 1, 5, 5, 6, 6, 3, 4, 4, 3, 
3, 7, 3, 4, 5, 3, 0, 6, 4, 0, 1, 2, 6, 7, 2, 6, 0, 4, 3, 6, 3, 5, 6, 3, 5, 1, 4, 6, 1, 5, 3, 1, 3, 5, 7, 4, 3, 6, 5, 6, 0, 4, 0, 5, 7, 
1, 5, 0, 6, 7, 0, 2, 4, 2, 6, 0, 3, 5, 0, 6, 6, 4, 5, 2, 1, 1, 1, 7, 2, 5, 2, 7, 3, 4, 6, 3, 0, 1, 7, 4, 5, 6, 3, 0, 2, 7, 4, 6, 1, 5, 
6, 1, 7, 4, 3, 5, 0, 6, 6, 0, 4, 3, 6, 5, 3, 7, 4, 5, 7, 0, 4, 6, 0, 7, 3, 4, 2, 0, 6, 1, 2, 6, 4, 2, 4, 6, 7, 1, 1, 0, 2, 4, 1, 1, 2, 
6, 3, 5, 1, 1, 5, 5, 3, 2, 4, 7, 6, 1, 4, 0, 0, 2, 2, 2, 4, 6, 3, 3, 1, 6, 6, 4, 2, 6, 1, 7, 3, 1, 5, 5, 7, 5, 0, 3, 2, 2, 2, 7, 3, 3, 
4, 3, 3, 2, 5, 5, 4, 6, 6, 3, 7, 0, 1, 1, 5, 1, 1, 2, 6, 5, 0, 7, 0, 0, 3, 3, 1, 3, 5, 5, 2, 3, 6, 5, 7, 3, 7, 7, 0, 5, 4, 7, 6, 1, 7, 
4, 7, 4, 0, 2, 0, 7, 0, 3, 5, 7, 2, 3, 7, 1, 7, 3, 6, 1, 0, 5, 7, 4, 6, 3, 1, 0, 2, 5, 7, 4, 1, 7, 4, 3, 1, 1, 7, 3, 5, 2, 3, 0, 2, 4, 
2, 4, 2, 1, 7, 3, 0, 2, 4, 5, 0, 5, 7, 0, 3, 5, 5, 0, 3, 3, 1, 1, 1, 4, 2, 1, 6, 0, 5, 5, 6, 5, 3, 5, 4, 6, 3, 2, 2, 2, 6, 3, 2, 0, 6, 
3, 3, 7, 5, 7, 1, 0, 2, 1, 6, 2, 3, 5, 3, 3, 3, 7, 1, 6, 6, 3, 7, 1, 2, 7, 1, 1, 1, 6, 5, 6, 7, 5, 3, 7, 4, 2, 5, 0, 2, 0, 6, 5, 4, 5, 
5, 0, 7, 5, 7, 6, 6, 0, 4, 0, 7, 4, 0, 6, 1, 7, 3, 2, 0, 6, 2, 3, 4, 7, 7, 6, 5, 5, 1, 6, 4, 4, 4, 4, 5, 0, 0, 1, 2, 0, 3, 5, 3, 3, 3, 
1, 7, 0, 1, 0, 7, 4, 6, 6, 2, 5, 7, 5, 6, 3, 7, 0, 6, 2, 7, 4, 1, 5, 0, 6, 7, 6, 2, 4, 0, 3, 2, 1, 0, 5, 6, 6, 4, 7, 5, 6, 5, 7, 6, 1, 
1, 6, 7, 4, 3, 0, 1, 3, 6, 3, 3, 6, 7, 3, 0, 0, 1, 4, 4, 0, 2, 4, 6, 3, 6, 3, 1, 1, 4, 5, 0, 4, 0, 2, 4, 2, 4, 3, 1, 0, 2, 5, 6, 5, 0, 
1, 6, 3, 5, 5, 7, 3, 0, 2, 5, 1, 7, 1, 6, 2, 0, 6, 0, 0, 7, 3, 2, 0, 5, 1, 6, 7, 6, 4, 1, 3, 0, 4, 0, 4, 1, 7, 6, 0, 5, 5, 4, 1, 0, 6, 
6, 1, 1, 4, 6, 3, 5, 6, 1, 5, 4, 3, 5, 1, 0, 6, 2, 6, 3, 7, 2, 0, 3, 3, 5, 7, 7, 2, 2, 5, 3, 4, 5, 2, 1, 2, 6, 1, 4, 4, 4, 6, 3, 5, 2, 
1, 1, 7, 5, 7, 0, 5, 4, 1, 0, 6, 4, 1, 1, 5, 1, 3, 3, 5, 6, 7, 0, 2, 6, 6, 6, 6, 5, 4, 2, 1, 2, 1, 4, 2, 1, 4, 7, 7, 6, 0, 1, 2, 7, 4, 
3, 5, 4, 3, 3, 0, 4, 0, 1, 3, 4, 1, 3, 5, 2, 2, 5, 5, 4, 6, 4, 0, 0, 7, 4, 5, 1, 4, 0, 7, 5, 7, 0, 2, 1, 7, 6, 7, 1, 6, 2, 2, 5, 7, 4, 
0, 3, 7, 5, 7, 3, 1, 7, 2, 0, 1, 2, 1, 5, 3, 3, 0, 1, 1, 6, 0, 6, 7, 0, 4, 4, 5, 1, 4, 5, 7, 7, 6, 7, 1, 1, 0, 1, 6, 6, 3, 1, 1, 2, 4, 
2, 3, 1, 1, 0, 5, 1, 0, 4, 7, 6, 3, 0, 7, 4, 2, 4, 1, 3, 2, 7, 7, 2, 1, 5, 7, 4, 5, 5, 3, 6, 3, 0, 0, 6, 0, 0, 0, 7, 3, 0, 0, 5, 4, 5, 
4, 5, 6, 6, 0, 1, 1, 2, 1, 1, 0, 7, 3, 0, 1, 4, 3, 4, 7, 7, 0, 5, 1, 6, 1, 7, 4, 6, 2, 1, 3, 4, 3, 1, 7, 6, 0, 0, 4, 7, 5, 0, 6, 3, 1, 
1, 2, 0, 1, 2, 6, 6, 1, 2, 6, 0, 7, 2, 1, 6, 7, 1, 0, 1, 3, 2, 1, 7, 6, 0, 0, 5, 3, 6, 5, 3, 6, 1, 3, 5, 6, 3, 6, 4, 1, 4, 4, 0, 6, 7, 
0, 0, 0, 4, 6, 2, 6, 0, 6, 1, 5, 1, 0, 0, 4, 4, 6, 7, 5, 6, 4, 2, 7, 0, 2, 7, 6, 0, 4, 6, 0, 7, 2, 6, 6, 7, 5, 2, 1, 5, 2, 3, 6, 0, 7, 
6, 3, 1, 0, 4, 1, 3, 4, 1, 6, 7, 6, 1, 7, 2, 4, 0, 7, 0, 2, 7, 7, 0, 0, 4, 1, 6, 4, 7, 0, 7, 0, 4, 0, 7, 1, 1, 6, 3, 2, 6, 4, 0, 1, 3, 
2, 1, 2, 7, 1, 1, 5, 0, 5, 0, 7, 1, 0, 3, 6, 2, 2, 6, 4, 4, 5, 3, 6, 0, 3, 5, 0, 3, 2, 6, 0, 1, 3, 4, 1, 6, 4, 6, 4, 0, 7, 2, 7, 4, 1, 
4, 1, 5, 1, 3, 4, 0, 3, 4, 1, 0, 6, 1, 4, 4, 0, 7, 0, 3, 5, 0, 6, 1, 0, 3, 2, 2, 1, 6, 4, 3, 1, 4, 1, 3, 7, 3, 3, 4, 2, 6, 5, 4, 5, 4, 
3, 4, 7, 2, 7, 3, 2, 1, 4, 7, 0, 0, 7, 4, 4, 4, 6, 7, 5, 3, 1, 1, 0, 4, 0, 4, 2, 3, 1, 5, 3, 2, 0, 4, 2, 2, 2, 1, 7, 4, 0, 1, 1, 6, 1, 
4, 0, 5, 3, 4, 6, 0, 1, 0, 4, 7, 0, 5, 0, 2, 0, 5, 1, 3, 6, 5, 6, 6, 6, 2, 0, 6, 1, 2, 0, 7, 4, 1, 4, 3, 6, 3, 5, 2, 3, 2, 3, 5, 6, 2, 
0, 6, 5, 2, 3, 1, 0, 2, 3, 6, 6, 5, 3, 5, 3, 2, 7, 7, 0, 7, 3, 3, 6, 6, 4, 4, 2, 5, 3, 5, 0, 0, 2, 2, 0, 7, 3, 7, 3, 3, 2, 2, 4, 3, 3, 
0, 3, 4, 6, 0, 6, 5, 3, 2, 7, 1, 1, 4, 7, 6, 7, 4, 4, 1, 3, 5, 7, 3, 7, 5, 4, 3, 6, 5, 1, 1, 6, 7, 6, 6, 2, 0, 4, 2, 4, 7, 3, 6, 3, 6, 
5, 4, 4, 5, 0, 4, 7, 1, 4, 4, 4, 6, 2, 5, 2, 4, 2, 3, 2, 5, 4, 4, 4, 1, 2, 1, 0, 1, 2, 5, 7, 4, 4, 5, 5, 2, 7, 5, 3, 2, 3, 2, 7, 0, 4, 
7, 0, 4, 0, 1, 6, 6, 7, 4, 4, 3, 5, 2, 7, 5, 7, 3, 3, 4, 0, 3, 3, 4, 3, 7, 3, 2, 0, 1, 3, 3, 1, 5, 3, 3, 0, 3, 5, 6, 3, 2, 3, 7, 6, 4, 
3, 7, 2, 5, 6, 6, 1, 0, 2, 7, 2, 1, 1, 0, 7, 5, 2, 3, 2, 6, 7, 3, 2, 2, 7, 7, 4, 2, 7, 5, 4, 6, 0, 3, 3, 0, 2, 0, 4, 5, 0, 1, 6, 7, 5, 1
                        };

int Deinterleaver1[2*2337*3] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 0, 1655, 2064, 394, 2642, 3983, 4147, 3742, 829, 1559, 2321, 556, 491, 281, 2546, 1459, 2761, 1294, 1228, 2924, 4092, 1110, 4345, 1374, 952, 891, 3562, 2790, 3995, 1814, 105, 3537, 216, 351, 4519, 146, 228, 2376, 3932, 3169, 498, 4388, 4196, 4408, 2191, 2810, 1734, 302, 1792, 3543, 2518, 1461, 496, 3065, 2962, 4367, 4156, 2550, 4237, 722, 4517, 3178, 2842, 1175, 2827, 1401, 4613, 2197, 180, 3147, 1363, 240, 2500, 144, 3695, 1163, 1553, 2972, 3331, 1492, 3236, 3416, 1425, 2353, 3970, 2637, 3921, 250, 269, 1811, 2562, 1028, 2719, 2151, 3224, 1193, 3054, 122, 2350, 1907, 2462, 1538, 1158, 4391, 2140, 2950, 822, 317, 3281, 761, 2526, 330, 2272, 902, 2712, 893, 373, 4558, 2552, 3222, 3459, 3477, 3249, 3716, 3251, 3512, 1224, 3592, 914, 1132, 2444, 4014, 2408, 2280, 3345, 1453, 4166, 3410, 334, 1789, 2626, 919, 4098, 1528, 3708, 785, 1612, 1796, 3857, 4151, 3530, 3813, 4287, 2763, 1565, 4027, 1413, 2486, 1630, 3612, 1154, 4547, 195, 3739, 29, 687, 3133, 864, 3804, 1505, 2189, 925, 4348, 3469, 3314, 361, 2781, 3026, 2896, 347, 278, 1348, 2128, 2046, 2766, 4395, 2238, 1957, 1927, 3832, 4384, 1245, 3765, 875, 287, 1083, 4650, 1444, 571, 2673, 1086, 1942, 1690, 2423, 3697, 3636, 164, 1569, 4192, 2902, 1784, 1238, 3758, 927, 3127, 2685, 3589, 3673, 573, 2279, 150, 2838, 67, 1264, 4012, 4308, 2746, 811, 2245, 4549, 358, 2077, 742, 86, 3572, 1567, 685, 1428, 4078, 404, 3254, 400, 3074, 4506, 172, 2884, 1722, 911, 2028, 596, 1234, 254, 660, 4175, 2807, 3662, 1874, 629, 2836, 2915, 2186, 603, 2522, 3884, 2777, 532, 3070, 3064, 66, 1592, 904, 1598, 4648, 284, 1960, 700, 3650, 2442, 2727, 1534, 2889, 4574, 4297, 566, 3564, 3157, 3184, 3680, 2117, 4047, 559, 2631, 4491, 3718, 2310, 3329, 2402, 3363, 215, 2182, 1744, 4132, 151, 443, 3729, 2502, 3265, 3964, 71, 4394, 1318, 4494, 1335, 1512, 261, 3244, 4097, 4493, 1191, 1324, 35, 369, 639, 22, 4446, 4465, 4467, 376, 4423, 3802, 4435, 3687, 1100, 4295, 1682, 1635, 419, 2365, 2157, 166, 3540, 3961, 2297, 387, 2172, 791, 3312, 3555, 2255, 3496, 1589, 1341, 255, 3781, 3103, 4442, 2009, 2876, 4276, 4516, 4075, 1887, 1574, 2833, 2841, 2076, 889, 484, 4212, 4588, 3445, 3423, 4641, 1165, 909, 3373, 643, 2427, 3974, 1500, 2813, 138, 4350, 3736, 2859, 140, 3195, 1785, 1951, 3631, 1695, 1593, 1345, 2363, 1060, 4320, 2173, 2253, 2458, 1667, 890, 4471, 2341, 4324, 3432, 746, 1884, 3966, 1480, 1704, 2289, 1803, 964, 3812, 34, 3756, 3092, 3532, 907, 1518, 4284, 1994, 1507, 1015, 997, 474, 2947, 3452, 3891, 89, 1665, 522, 4664, 1965, 3633, 2869, 4535, 2702, 526, 2209, 4654, 3370, 2995, 4478, 1510, 445, 2772, 1406, 958, 4565, 1002, 3615, 4232, 2792, 3664, 2832, 3025, 917, 2431, 226, 3261, 239, 3253, 1703, 1370, 1838, 2539, 3761, 3325, 2256, 1496, 2839, 770, 2641, 1293, 104, 4407, 4155, 3146, 1424, 1192, 3280, 3476, 3344, 1795, 1153, 3468, 2237, 2672, 3757, 4307, 4077, 253, 2776, 2441, 558, 442, 4096, 3801, 2296, 4441, 4211, 137, 1059, 3965, 4283, 1964, 2771, 225, 769, 1152, 3800, 3799, 4325, 3567, 689, 1740, 1902, 883, 4034, 4660, 4221, 3795, 831, 4326, 2934, 4019, 1737, 1841, 3958, 2733, 3218, 3206, 3773, 1075, 1670, 99, 3568, 315, 3071, 3120, 4476, 1555, 3819, 4051, 3022, 1274, 413, 4061, 324, 690, 3471, 4336, 2308, 934, 9, 1303, 727, 3234, 594, 905, 1473, 3985, 1741, 4333, 981, 4431, 4635, 3277, 485, 978, 1007, 3654, 1095, 4310, 1484, 1903, 4065, 1371, 2497, 4002, 1063, 2862, 534, 1615, 2794, 446, 1475, 667, 884, 94, 1773, 2331, 1328, 2913, 2660, 3095, 575, 681, 542, 4106, 4474, 4035, 1321, 1806, 120, 4672, 1503, 2155, 2769, 3827, 2217, 1584, 4200, 2649, 4661, 1250, 859, 2300, 607, 2373, 3433, 3997, 624, 1391, 3582, 4182, 1186, 4222, 2504, 4022, 3514, 2571, 1394, 25, 4010, 2345, 1439, 2731, 3879, 68, 3796, 3919, 4314, 1531, 235, 111, 1730, 3290, 1325, 1801, 2079, 1725, 3596, 832, 1809, 2834, 3450, 3093, 2086, 2991, 2061, 290, 4122, 3404, 678, 3042, 4327, 537, 423, 3110, 3894, 297, 2488, 1650, 4031, 3829, 3359, 4583, 1160, 2935, 4162, 3675, 1219, 3461, 1384, 77, 663, 1866, 944, 4372, 641, 4112, 4020, 3626, 2356, 1849, 2318, 3725, 2263, 1050, 1759, 1118, 1557, 2894, 3553, 1738, 1382, 3776, 4109, 2017, 2974, 222, 4601, 3180, 2741, 2824, 1562, 1619, 1842, 3316, 814, 3285, 1548, 2879, 3599, 4576, 2984, 2707, 1599, 2021, 2593, 3959, 750, 1515, 1576, 3130, 2229, 4213, 1106, 1352, 2492, 1821, 2383, 4569, 2734, 322, 1839, 4510, 4094, 817, 697, 2348, 3062, 4533, 118, 3987, 802, 3219, 1207, 1147, 3256, 2738, 545, 4487, 2088, 4268, 3950, 992, 3304, 4300, 3207, 1298, 3262, 3989, 4187, 1861, 3187, 4526, 3367, 3876, 4252, 2386, 1882, 3774, 2938, 3465, 987, 2774, 380, 4194, 1816, 1971, 2530, 1034, 840, 2675, 1076, 4639, 3968, 1226, 1955, 2007, 2932, 3624, 1638, 3787, 3616, 1520, 1265, 1671, 2479, 854, 2037, 1595, 732, 2849, 438, 36, 4261, 3881, 2315, 2820, 100, 466, 4172, 1715, 3533, 3213, 2429, 2688, 1632, 3838, 3036, 2106, 300, 3569, 2397, 1215, 675, 3542, 1728, 1170, 3976, 234, 2219, 3173, 1916, 4258, 316, 3649, 444, 2648, 1881, 3778, 683, 1279, 3456, 75, 3836, 1367, 1418, 3072, 1640, 4089, 1708, 4560, 39, 1129, 797, 1013, 129, 3191, 4552, 3050, 3121, 1920, 57, 2367, 765, 3333, 2545, 205, 3712, 3769, 3826, 2391, 3660, 4477, 363, 729, 1782, 1893, 2787, 1080, 4030, 1941, 2789, 4649, 2075, 1074, 1556, 3190, 1879, 477, 310, 2555, 4589, 1282, 207, 3938, 1949, 47, 2403, 3820, 4593, 2540, 3420, 3390, 4265, 598, 4380, 3770, 2092, 113, 1743, 1483, 4052, 2195, 1466, 2389, 1804, 3403, 4655, 2993, 1310, 149, 3132, 4418, 3744, 3023, 2737, 3152, 804, 3792, 4627, 372, 3156, 3663, 623, 1970, 2512, 3779, 1275, 4459, 83, 621, 3104, 4235, 1692, 107, 2513, 2484, 3897, 3354, 708, 414, 3118, 2119, 3594, 3907, 519, 2358, 2901, 27, 1985, 504, 4503, 4013, 4062, 2419, 211, 2983, 3128, 4595, 577, 2799, 370, 3526, 2068, 4598, 1711, 325, 1190, 227, 3635, 908, 3818, 221, 2544, 1767, 1676, 1041, 4377, 4087, 691, 3916, 834, 4281, 2001, 569, 2606, 3558, 2122, 1586, 1355, 3087, 2205, 3472, 3052, 4057, 3440, 2646, 4111, 2930, 2249, 320, 975, 850, 4567, 2364, 4337, 3789, 2138, 565, 1126, 3444, 844, 764, 2025, 966, 1880, 4203, 3511, 2309, 1702, 2570, 1954, 3906, 1494, 1768, 3376, 2221, 2411, 3037, 4129, 3162, 935, 2783, 712, 3176, 2988, 2160, 3759, 3448, 256, 2413, 285, 428, 3398, 10, 870, 60, 4134, 739, 2027, 3446, 3657, 1169, 233, 2371, 3142, 2457, 1304, 2779, 3762, 1044, 1763, 1031, 1973, 2868, 2809, 3126, 3735, 4335, 813, 728, 711, 1899, 1753, 4495, 3560, 1544, 2063, 1458, 3994, 4387, 2961, 2196, 3235, 2150, 821, 3221, 2407, 784, 1629, 924, 2765, 1443, 1783, 1263, 684, 595, 2521, 699, 2116, 4131, 260, 375, 3539, 3780, 888, 1499, 1344, 745, 906, 521, 1509, 916, 1495, 3343, 441, 768, 3794, 1669, 4060, 1472, 4309, 1474, 4105, 4199, 4181, 3878, 1724, 677, 4582, 640, 2893, 1561, 2020, 2382, 3986, 3303, 2385, 839, 1519, 2314, 2105, 1915, 1366, 4551, 2390, 2074, 46, 1742, 4417, 2511, 3353, 4502, 4597, 4376, 3086, 4566, 4202, 4128, 427, 3141, 4334, 2960, 1262, 1343, 1471, 2019, 2073, 426, 1524, 2575, 4054, 1525, 947, 982, 3618, 1103, 930, 3228, 1930, 364, 2663, 968, 266, 478, 2576, 191, 4432, 2611, 1834, 1975, 1481, 3238, 1677, 2908, 2014, 3521, 3267, 4055, 2558, 4636, 3028, 1900, 4225, 3101, 2147, 2405, 3488, 55, 1828, 1961, 1526, 1333, 3278, 1799, 4259, 3524, 2891, 3080, 3424, 3006, 1854, 2233, 183, 948, 1407, 486, 430, 3326, 2697, 3703, 652, 1779, 2143, 3645, 1998, 2290, 983, 1477, 979, 1287, 384, 3115, 3474, 4667, 1513, 292, 1167, 4207, 824, 3619, 63, 1008, 4250, 142, 1209, 1037, 3504, 421, 1173, 740, 4469, 976, 1104, 1280, 3655, 3004, 2177, 3865, 2183, 2904, 845, 218, 1276, 1857, 3046, 931, 2110, 1096, 462, 2523, 1134, 1769, 3749, 1403, 4271, 354, 4618, 3509, 3229, 2747, 4311, 551, 3899, 635, 3930, 3159, 2800, 16, 23, 3082, 1021, 1931, 3099, 1485, 4543, 3009, 263, 4285, 367, 4305, 2084, 3211, 3816, 2312, 365, 4158, 1904, 2967, 954, 3602, 588, 2680, 337, 2715, 961, 2651, 4404, 2664, 4278, 4066, 174, 4628, 2224, 3385, 2976, 392, 736, 1747, 4540, 540, 969, 406, 1372, 1522, 4142, 502, 4085, 4530, 1922, 3204, 4382, 1315, 311, 267, 3463, 2498, 398, 2287, 2495, 4508, 3418, 1042, 2695, 3845, 1054, 2424, 479, 1659, 4003, 2898, 1754, 3872, 3943, 3607, 3030, 2200, 2069, 1017, 701, 2577, 4330, 1064, 705, 1416, 2380, 212, 4219, 4642, 2179, 4316, 2970, 4025, 192, 408, 2863, 695, 2257, 3847, 343, 586, 197, 1642, 1330, 154, 4545, 4433, 2294, 535, 2395, 3914, 4415, 2965, 4352, 1305, 4124, 3868, 2098, 2508, 2612, 4455, 1616, 3955, 1045, 1149, 4037, 2113, 655, 4610, 1091, 2920, 2582, 1835, 3457, 2795, 3295, 3479, 2823, 2910, 3941, 1199, 353, 4460, 1025, 972, 1976, 3910, 447, 3963, 4204, 2446, 3377, 1878, 3415, 1233, 1517, 666, 801, 1482, 812, 1476, 2293, 4341, 2439, 757, 4365, 1540, 2866, 4447, 3426, 3732, 3239, 4254, 668, 2635, 51, 1358, 1995, 4160, 3853, 1685, 3912, 62, 1745, 1678, 2848, 885, 4354, 2535, 4647, 3202, 3365, 676, 1128, 3401, 4663, 2016, 2909, 2670, 95, 3069, 1654, 2188, 165, 224, 3358, 3172, 1354, 4127, 4403, 2015, 200, 1774, 1267, 12, 2516, 3841, 4606, 2916, 109, 2011, 1432, 2556, 3522, 2241, 2332, 116, 4537, 939, 3793, 1427, 4378, 4045, 2262, 3035, 4153, 3268, 3661, 1329, 349, 4496, 4422, 2265, 3610, 4241, 996, 2274, 899, 3651, 4056, 2561, 2914, 3890, 574, 4267, 1309, 1457, 1166, 3867, 2040, 2215, 2334, 2559, 1582, 2661, 528, 1497, 1056, 3935, 1609, 1864, 1688, 2536, 2050, 170, 4637, 4342, 3096, 2227, 1658, 1069, 1108, 4555, 3378, 3406, 2041, 3630, 1488, 3029, 2368, 576, 1912, 1120, 3258, 1308, 1142, 3644, 1116, 2320, 346, 2254, 1901, 76, 682, 2929, 2072, 391, 3357, 2043, 2829, 4521, 84, 862, 553, 4226, 1469, 543, 1181, 613, 4016, 2222, 1202, 4362, 4169, 2398, 1776, 2435, 3102, 2246, 4107, 794, 1969, 2954, 4580, 592, 2010, 937, 4466, 3008, 4401, 2148, 189, 4475, 809, 3041, 2328, 1508, 1906, 65, 2701, 4671, 4186, 3791, 2406, 1036, 4036, 1307, 2705, 1196, 2677, 3241, 14, 1626, 1255, 1252, 201, 3489, 1004, 1322, 4480, 3245, 3089, 4591, 4603, 2044, 3929, 2847, 1751, 1139, 56, 1885, 1807, 1673, 1963, 3015, 1237, 135, 1543, 2596, 1221, 2326, 4590, 1829, 2964, 121, 2923, 1926, 2875, 4018, 2355, 4088, 2137, 1102, 4141, 11, 1962, 1986, 4673, 280, 3561, 3168, 495, 1400, 3330, 1027, 2139, 4557, 2443, 1527, 1412, 1504, 2127, 1082, 4191, 2837, 3571, 910, 2185, 283, 3183, 2181, 1334, 4464, 2156, 1340, 2840, 2426, 1694, 4323, 3091, 88, 2994, 2831, 3324, 3279, 2440, 2770, 4659, 3772, 1273, 593, 3653, 2793, 680, 2216, 1390, 1438, 1800, 4121, 3828, 943, 1117, 2740, 2706, 2491, 4532, 3949, 3875, 2529, 3786, 4260, 3837, 2218, 74, 128, 3768, 2788, 3937, 2091, 148, 622, 2483, 1984, 3525, 1675, 1585, 974, 965, 2410, 2412, 232, 3125, 3993, 1442, 887, 1668, 2892, 4550, 4201, 2574, 265, 3520, 1827, 2232, 1997, 4206, 4468, 1856, 4617, 3081, 3815, 2650, 4539, 1314, 1053, 1016, 2969, 153, 2097, 2919, 1024, 665, 3425, 61, 4662, 4126, 1431, 3034, 898, 2214, 2049, 3629, 345, 861, 1775, 3007, 4185, 1251, 1750, 2325, 4140, 4556, 3182, 2830, 1389, 2528, 2482, 886, 1855, 1023, 860, 2481, 1987, 1259, 4243, 4042, 3011, 4437, 4338, 1988, 1283, 2234, 2305, 2301, 2817, 604, 4102, 1376, 3972, 692, 1410, 433, 1260, 3706, 184, 617, 608, 1350, 1545, 3137, 3149, 4303, 1977, 4427, 627, 4244, 2728, 949, 3685, 2374, 162, 3371, 4049, 4599, 203, 3374, 2906, 2693, 4043, 2135, 1408, 2475, 3434, 880, 771, 481, 4246, 781, 2166, 2567, 2978, 3012, 2032, 487, 758, 3998, 1602, 156, 3551, 246, 1981, 2710, 3044, 2335, 4438, 4621, 431, 2029, 625, 2400, 1623, 547, 1197, 1891, 3077, 3721, 2644, 4339, 1222, 3327, 1368, 1392, 2005, 517, 3341, 3747, 1876, 1200, 230, 3105, 1989, 1868, 2698, 646, 3583, 3692, 2450, 2282, 3038, 3107, 716, 4483, 1570, 1284, 3379, 3704, 359, 4183, 2132, 1089, 601, 3485, 2956, 2604, 3454, 377, 2235, 4633, 653, 788, 1187, 3714, 2853, 1144, 998, 956, 1732, 2683, 2857, 2306, 3283, 1780, 3174, 4223, 3870, 4420, 3166, 3135, 41, 2266, 4007, 242, 2302, 1268, 2144, 1434, 2505, 2619, 3517, 3197, 1764, 2743, 4522, 1937, 1301, 2818, 1679, 3646, 2270, 4023, 856, 1, 1137, 2855, 3273, 1578, 3810, 448, 605, 208, 1999, 2754, 3515, 1718, 1656, 1451, 3727, 2639, 3917, 2477, 2417, 4103, 549, 2291, 792, 2572, 2130, 2065, 43, 3946, 457, 3019, 1242, 18, 1377, 1535, 984, 1289, 1395, 3576, 395, 4357, 1662, 827, 644, 847, 3393, 3973, 2940, 1478, 2997, 26, 3700, 2643, 1661, 4240, 4138, 807, 612, 3730, 693, 1886, 980, 4366, 4011, 2362, 3984, 2592, 1073, 3397, 1332, 4329, 2560, 1411, 3684, 1288, 168, 2346, 2750, 4148, 4489, 2678, 4411, 4571, 2615, 3549, 434, 3807, 385, 1419, 1440, 3018, 3743, 2212, 3885, 3356, 4402, 2378, 4236, 1261, 3548, 3116, 3659, 2732, 2343, 830, 3347, 4130, 1991, 1491, 4452, 1925, 3707, 1511, 3475, 2078, 3880, 2067, 1560, 1020, 3731, 4400, 4616, 4632, 4424, 185, 4425, 4668, 2415, 69, 2094, 2322, 3642, 475, 3604, 3483, 4500, 2633, 618, 4568, 1514, 2996, 3797, 2100, 557, 2724, 179, 1947, 2808, 2999, 326, 609, 13, 293, 738, 3920, 2759, 492, 2603, 3674, 2826, 85, 2340, 1006, 1351, 206, 1168, 1853, 4315, 2039, 282, 2692, 3392, 2103, 795, 4624, 4472, 1546, 3939, 4208, 4071, 1532, 1449, 2547, 3335, 3259, 3923, 835, 3436, 3161, 3138, 306, 825, 2434, 236, 2048, 1460, 2268, 1113, 2629, 1729, 3843, 2269, 3150, 2890, 3620, 169, 112, 1313, 2762, 638, 4076, 2990, 2428, 220, 2104, 4304, 3852, 64, 152, 1731, 3482, 1295, 4005, 1211, 2453, 472, 753, 3904, 1978, 3438, 1009, 1541, 3291, 1910, 1229, 53, 2760, 1852, 2617, 539, 1583, 4428, 1581, 4251, 967, 1326, 4059, 2925, 2090, 3242, 1758, 2422, 1422, 1823, 628, 3967, 143, 3073, 1802, 4001, 4093, 3389, 1762, 3702, 342, 3934, 1693, 4245, 4239, 1210, 2797, 2080, 2803, 1111, 1455, 3163, 1870, 126, 3640, 3887, 2729, 4063, 1038, 743, 1726, 45, 4346, 4371, 158, 3323, 509, 1721, 3803, 950, 186, 3505, 4486, 3597, 4514, 1375, 3384, 2948, 590, 1296, 1622, 194, 3686, 4440, 422, 1214, 833, 2510, 953, 2534, 2704, 1430, 4419, 555, 951, 2375, 2517, 1174, 1552, 1810, 1157, 892, 913, 918, 1564, 863, 277, 874, 163, 2278, 741, 2883, 2835, 1597, 3563, 3362, 1317, 21, 418, 3495, 1573, 3372, 1950, 4470, 33, 3451, 4653, 2791, 2538, 1423, 252, 4282, 882, 3217, 4050, 726, 977, 533, 3094, 2768, 3996, 4009, 3289, 2060, 1649, 662, 1049, 4600, 4575, 1105, 2347, 2087, 4525, 1815, 3623, 437, 2687, 3975, 1278, 796, 204, 4029, 1281, 4379, 2992, 3155, 106, 2900, 2798, 2543, 3557, 2248, 763, 3375, 3447, 3656, 2867, 2062, 923, 3538, 767, 4581, 1914, 3085, 425, 2662, 2907, 3487, 3005, 2142, 291, 1172, 217, 4270, 15, 2083, 2714, 735, 3203, 2694, 2199, 2178, 1641, 4123, 4609, 352, 1232, 2865, 1684, 1127, 3171, 108, 4044, 995, 3866, 1687, 3405, 1115, 4520, 4168, 936, 2700, 1625, 3928, 2595, 2136, 1026, 2184, 87, 679, 3948, 147, 3992, 4205, 2096, 3628, 1388, 4436, 1409, 4426, 2905, 2566, 3043, 3720, 229, 4482, 3453, 2682, 4006, 1936, 3809, 2476, 1241, 846, 611, 4328, 2614, 2377, 4451, 4631, 4499, 2998, 2339, 4623, 3435, 3842, 219, 752, 538, 1421, 3933, 3639, 1720, 1621, 554, 276, 3494, 881, 661, 1277, 2247, 424, 734, 3170, 3927, 1387, 1935, 2338, 275, 274, 772, 48, 1858, 2943, 3111, 2054, 499, 1122, 670, 271, 2002, 773, 4114, 482, 2941, 3047, 416, 3895, 4397, 4389, 244, 2260, 2872, 1239, 49, 1489, 4247, 4298, 932, 2751, 298, 512, 4197, 2460, 1590, 524, 1501, 1859, 4625, 782, 3502, 2111, 1140, 2489, 1889, 4409, 1756, 2081, 2654, 450, 2944, 778, 2167, 871, 1097, 4448, 1651, 2163, 2192, 131, 2275, 755, 2668, 3112, 529, 2568, 3682, 463, 2250, 4032, 1697, 2811, 3952, 1627, 2656, 1832, 2055, 1235, 2979, 3527, 2524, 4090, 3830, 4274, 1735, 1847, 1706, 563, 928, 500, 2514, 3013, 1257, 1135, 2690, 3360, 3925, 303, 3412, 2784, 648, 3822, 1123, 2436, 2033, 3497, 1770, 3573, 4584, 459, 1793, 2587, 58, 631, 2369, 671, 3688, 488, 4669, 3750, 2589, 1161, 470, 3544, 2624, 3892, 339, 1212, 272, 382, 759, 2725, 1404, 1248, 2936, 4457, 2519, 3002, 3293, 2927, 72, 2003, 3016, 3999, 4607, 4272, 3299, 4163, 3270, 1462, 579, 4562, 1844, 4227, 774, 1699, 1603, 4290, 355, 1467, 3676, 2851, 497, 305, 4512, 1048, 2344, 4115, 616, 157, 2404, 4619, 2581, 1220, 1826, 3066, 2121, 810, 1813, 570, 483, 98, 3552, 3049, 3510, 190, 3462, 2240, 2963, 2304, 2753, 4070, 32, 2942, 2580, 247, 567, 3230, 4149, 1385, 1067, 4368, 3902, 3981, 2757, 2814, 3048, 4473, 1982, 4454, 2748, 4053, 78, 1040, 4157, 3874, 2804, 3233, 3764, 417, 1917, 2711, 2773, 4312, 3427, 664, 2286, 2551, 3679, 3024, 3581, 1033, 3896, 1498, 3045, 971, 552, 1983, 1867, 3547, 4238, 994, 1256, 452, 1967, 4398, 2392, 2336, 4429, 3900, 1709, 945, 3301, 723, 412, 2174, 4463, 747, 4390, 2485, 4439, 453, 636, 3061, 4373, 990, 4518, 336, 713, 3585, 3084, 245, 4116, 4622, 2171, 3931, 1568, 642, 3021, 3179, 3711, 2220, 2013, 3844, 2261, 1101, 432, 2416, 3160, 3216, 4113, 97, 2843, 258, 90, 2717, 2454, 2873, 3668, 2030, 3247, 2801, 1894, 4021, 1618, 1176, 719, 341, 3508, 3979, 1240, 1637, 626, 2917, 17, 4393, 3627, 3855, 2828, 309, 4217, 3318, 1470, 50, 3591, 2401, 1837, 24, 2931, 2357, 440, 1402, 3414, 4361, 3124, 715, 1490, 125, 1624, 3821, 3083, 248, 1850, 2466, 4614, 1217, 307, 2564, 2607, 4248, 2844, 548, 2911, 1022, 1177, 2319, 1959, 2198, 1270, 4375, 1012, 4233, 4299, 3129, 1198, 3565, 1932, 4490, 3726, 1361, 181, 238, 301, 3588, 139, 933, 1547, 1892, 2987, 3100, 3942, 2264, 494, 3148, 3945, 1112, 3288, 2259, 2752, 4374, 3078, 1644, 1486, 3733, 1051, 2469, 1364, 402, 3153, 1183, 3598, 299, 1057, 3722, 4573, 4544, 720, 1760, 820, 241, 3306, 1253, 2946, 2667, 513, 3395, 2645, 3586, 3010, 4561, 1119, 4165, 2501, 1292, 4313, 853, 210, 4198, 3898, 4340, 1968, 264, 1088, 1558, 4344, 145, 1791, 3177, 3694, 249, 2461, 901, 1223, 1788, 4286, 686, 2895, 1244, 3696, 3672, 357, 4505, 1873, 1591, 4296, 3328, 70, 368, 1681, 3554, 4074, 1164, 3194, 1666, 963, 473, 525, 3614, 1369, 4154, 4306, 1058, 1739, 3957, 1554, 8, 3276, 1062, 2912, 1502, 2372, 1393, 110, 2085, 296, 1383, 3724, 2973, 2878, 2228, 816, 544, 1860, 379, 2006, 731, 3212, 1727, 3777, 38, 3332, 2786, 2554, 4264, 3402, 4626, 4234, 518, 4594, 3817, 568, 4110, 3443, 1493, 2159, 2026, 1030, 3559, 783, 259, 3342, 1723, 2313, 4596, 2018, 1929, 3237, 2146, 3079, 651, 4666, 3503, 2903, 3748, 3158, 366, 2679, 2975, 4529, 3417, 3606, 4218, 585, 4351, 2112, 3940, 1877, 4364, 4159, 3364, 223, 4605, 1426, 3609, 1456, 1608, 4554, 1141, 2042, 1201, 591, 1905, 3240, 4602, 134, 2354, 1399, 3570, 4322, 3652, 2490, 3936, 231, 2231, 2968, 2213, 3181, 4041, 3971, 4302, 202, 780, 1980, 1890, 1875, 3106, 2955, 955, 40, 2742, 3272, 2638, 456, 826, 4137, 3396, 4410, 3355, 1990, 4399, 3603, 1946, 2825, 2102, 3922, 2628, 2989, 2452, 1851, 1757, 3701, 1869, 3322, 589, 1429, 1563, 20, 251, 2059, 2686, 2542, 1913, 2082, 1683, 2699, 2095, 2681, 4498, 1620, 1934, 270, 2871, 523, 2653, 754, 2655, 562, 647, 630, 338, 2926, 1843, 1047, 1812, 4069, 2756, 3232, 3580, 451, 4462, 3584, 2012, 2716, 3507, 3317, 3123, 2563, 1011, 3587, 3287, 1182, 2945, 852, 3693, 4504, 962, 1061, 815, 4263, 1029, 650, 584, 1607, 4321, 779, 4136, 2451, 2541, 2652, 3231, 3286, 1606, 2720, 3753, 514, 2721, 2123, 2168, 91, 2283, 2107, 4405, 3139, 1549, 3834, 2152, 1436, 1645, 3754, 1346, 872, 3782, 3039, 3185, 2665, 4412, 2880, 4083, 3225, 4, 4443, 515, 3737, 1098, 4209, 3108, 673, 4279, 3351, 3600, 4645, 1194, 3032, 3164, 2722, 2532, 4449, 3000, 717, 6, 4067, 4255, 4577, 4178, 3055, 3429, 1336, 2124, 2597, 1652, 1610, 4484, 3861, 175, 1819, 2985, 3349, 123, 3209, 3490, 2169, 2658, 2164, 2472, 1571, 4293, 4629, 1130, 2708, 1464, 2351, 658, 1992, 92, 1205, 2193, 709, 1285, 2393, 2225, 4657, 1600, 2360, 1908, 921, 2161, 2284, 2467, 132, 4176, 3380, 327, 3386, 4079, 2022, 1379, 2463, 3058, 4230, 2108, 3319, 2276, 1636, 3705, 2323, 2977, 214, 2594, 725, 1539, 1079, 4665, 4406, 3905, 756, 1713, 360, 1805, 393, 4347, 3960, 1151, 1159, 4257, 2204, 3140, 4277, 2669, 1003, 4184, 1433, 737, 1551, 751, 3298, 4392, 295, 3506, 1550, 614, 3113, 4144, 2133, 79, 1748, 3849, 1516, 3883, 2141, 3824, 843, 3835, 730, 530, 1327, 1090, 3421, 4541, 4150, 1577, 1897, 2951, 1001, 1705, 2153, 1587, 2569, 2718, 602, 1664, 541, 991, 3131, 4386, 823, 2507, 1487, 1437, 4620, 3683, 1580, 3486, 3681, 970, 4572, 2230, 3860, 318, 2243, 3621, 1646, 2860, 464, 4072, 2957, 333, 407, 81, 4214, 3400, 3282, 2202, 1871, 3755, 777, 2251, 1872, 2605, 3579, 1373, 669, 1107, 3382, 762, 4146, 490, 1347, 1588, 4033, 1865, 3455, 319, 1523, 1746, 1353, 2846, 2527, 1300, 1005, 873, 3493, 1698, 3590, 378, 851, 4143, 798, 2493, 581, 331, 3310, 3690, 3783, 900, 2812, 415, 2236, 2337, 503, 3321, 1822, 1072, 2273, 4100, 3760, 3040, 4615, 3953, 4461, 4634, 3980, 4086, 405, 2384, 1537, 903, 2208, 2154, 3186, 371, 1628, 420, 654, 3643, 4531, 3076, 4570, 2421, 2713, 1831, 1966, 2666, 1979, 2657, 3492, 789, 3637, 1923, 805, 2735, 4039, 894, 4579, 199, 4413, 714, 1833, 3806, 1188, 2557, 3205, 615, 323, 2886, 374, 1204, 2949, 2881, 4017, 2056, 799, 3715, 1109, 4383, 4515, 1840, 2317, 4559, 1125, 3227, 4084, 3840, 1236, 4242, 2854, 3391, 1316, 1386, 4511, 4360, 2553, 583, 842, 3226, 1356, 2980, 2455, 1145, 3698, 312, 1070, 4095, 1247, 3223, 2621, 3734, 5, 3437, 3528, 1254, 999, 2118, 268, 2616, 818, 508, 3460, 4216, 610, 4444, 141, 2525, 1533, 957, 858, 3464, 82, 698, 2176, 3478, 2071, 127, 516, 3741, 4091, 350, 1733, 721, 2499, 2636, 2349, 329, 3250, 3409, 3529, 3738, 2780, 3831, 1689, 2684, 2244, 399, 2806, 3063, 2888, 3717, 3264, 1323, 1099, 790, 4275, 3422, 2858, 2252, 2288, 1014, 4534, 4564, 3252, 103, 2671, 4210, 3566, 1736, 3119, 2307, 4430, 2496, 2330, 119, 2299, 3513, 1530, 3449, 3109, 1218, 1848, 4108, 3284, 1575, 4509, 3255, 3988, 986, 1225, 2036, 1714, 674, 2647, 1707, 2366, 1781, 476, 3419, 2388, 803, 620, 3593, 2982, 3634, 4280, 3439, 564, 1953, 3175, 4133, 1043, 1752, 3220, 2115, 915, 4180, 838, 3352, 1342, 929, 1974, 4224, 3523, 2696, 3114, 1208, 3864, 1133, 634, 262, 3601, 2223, 501, 2494, 3871, 2379, 3846, 4414, 1148, 2822, 2445, 2438, 1357, 4646, 2187, 2515, 938, 4421, 4266, 1055, 1068, 3257, 390, 4015, 2953, 2327, 1195, 3088, 3014, 2874, 3167, 4190, 2425, 1272, 2739, 3767, 2409, 3519, 1052, 3033, 4139, 1258, 4101, 3136, 4048, 480, 3550, 546, 3340, 2281, 600, 1143, 3165, 3196, 1136, 1450, 42, 4356, 1660, 2591, 4488, 2211, 3346, 1019, 3641, 2723, 2602, 2691, 3334, 2267, 637, 4004, 52, 2089, 3388, 1454, 4370, 3383, 2533, 912, 3361, 2537, 4008, 3622, 2899, 766, 4269, 1231, 4167, 3991, 4481, 4450, 3638, 3926, 1121, 243, 2459, 1755, 130, 3951, 1846, 3411, 2586, 2623, 3001, 578, 304, 2120, 2303, 3901, 3873, 3678, 993, 411, 335, 3710, 257, 718, 308, 3413, 1216, 1269, 237, 3944, 401, 3305, 1291, 1790, 3671, 3193, 7, 2877, 2785, 2158, 2145, 3605, 3608, 1398, 4301, 455, 2627, 2058, 2870, 4068, 1010, 649, 3752, 1435, 3, 3031, 3428, 3208, 657, 920, 3057, 1078, 4256, 294, 3823, 1000, 2506, 2242, 2201, 4145, 1299, 3309, 4099, 2207, 1830, 4578, 1203, 1124, 582, 2620, 4215, 2070, 3408, 3263, 102, 1529, 2035, 2981, 4179, 633, 2437, 2952, 3518, 599, 1018, 4369, 3990, 2585, 3709, 3670, 2057, 3056, 2206, 2034, 3669, 3198, 2447, 702, 505, 4188, 877, 786, 3199, 2470, 3430, 3500, 3498, 3977, 1765, 560, 2578, 435, 1862, 2600, 1613, 2448, 177, 1337, 1786, 1771, 2548, 2744, 4318, 4331, 748, 3188, 868, 1797, 703, 3888, 2125, 160, 3574, 1311, 4523, 510, 1065, 1359, 4527, 4081, 3858, 506, 3338, 2598, 3665, 4585, 2051, 1938, 1647, 706, 1944, 3368, 3746, 4152, 4189, 3246, 1653, 1924, 460, 2805, 1302, 31, 1417, 3192, 3877, 4229, 3531, 878, 1081, 1611, 3243, 1794, 3595, 2819, 1710, 2381, 3098, 4253, 188, 3814, 787, 2414, 4485, 2565, 2588, 3215, 1680, 4497, 213, 3075, 2387, 1397, 4288, 3200, 3067, 3862, 1818, 59, 167, 3647, 3484, 4220, 4289, 1883, 941, 2764, 2471, 4536, 176, 1542, 632, 3337, 2271, 1761, 4643, 4135, 3775, 4612, 1566, 3431, 1094, 1820, 1948, 2370, 182, 4024, 2333, 2180, 2134, 2939, 3851, 4028, 3501, 4453, 2986, 4363, 672, 332, 857, 4355, 4317, 1178, 3466, 468, 1414, 3499, 2456, 3350, 2622, 3689, 3790, 2, 4381, 2971, 3903, 988, 3145, 2487, 3978, 2882, 124, 3473, 489, 2031, 1138, 2324, 4026, 4445, 2775, 289, 1631, 1766, 1365, 3210, 3911, 4670, 2918, 2856, 2632, 193, 3808, 381, 3667, 3613, 561, 1712, 3491, 1952, 3751, 3336, 3274, 1179, 409, 1634, 4195, 2433, 1155, 2579, 2730, 2170, 2474, 2590, 54, 1579, 800, 2864, 1996, 1817, 2024, 4548, 436, 4117, 2659, 4171, 1162, 171, 3811, 2861, 696, 597, 1972, 1778, 196, 1863, 3090, 2165, 806, 471, 3556, 449, 3763, 2258, 4553, 2531, 776, 3740, 2601, 159, 2473, 1319, 3545, 3908, 606, 946, 3848, 849, 1035, 3785, 30, 1614, 286, 1572, 2608, 2625, 4193, 209, 3407, 344, 4507, 841, 3578, 688, 2449, 28, 4294, 136, 3893, 3541, 2000, 4501, 587, 3201, 2676, 897, 3134, 178, 2703, 4630, 3292, 340, 3275, 2755, 2203, 198, 837, 1077, 1093, 865, 1338, 866, 1131, 3611, 1213, 3307, 3516, 117, 1643, 80, 4640, 960, 3805, 1787, 1032, 2709, 4170, 273, 3311, 1719, 3886, 1331, 3151, 3969, 4174, 1506, 1772, 1146, 1465, 1898, 383, 3913, 1657, 3771, 155, 3982, 1227, 3536, 2190, 2549, 1362, 2352, 3053, 760, 3248, 1452, 3856, 4546, 3313, 1956, 1085, 926, 2745, 403, 659, 531, 2726, 2630, 3728, 4492, 4434, 386, 2008, 4587, 4349, 4319, 1479, 1993, 3632, 1405, 3260, 2640, 3467, 2295, 3798, 2933, 314, 3470, 4332, 4064, 93, 1320, 1249, 2503, 3918, 1808, 536, 4161, 3625, 1381, 3315, 749, 321, 1206, 1297, 2937, 4638, 2478, 465, 2396, 3648, 1639, 1919, 362, 3189, 4592, 2194, 2736, 4458, 3117, 2418, 1189, 3915, 3051, 3788, 1701, 2782, 869, 2778, 710, 2149, 2520, 520, 4104, 3302, 4416, 2959, 3617, 2610, 3027, 1798, 429, 1286, 4249, 3003, 461, 550, 4542, 2966, 173, 1521, 397, 2897, 704, 694, 2394, 3954, 3294, 3962, 2292, 2634, 4353, 3068, 1266, 115, 348, 3889, 527, 2226, 1911, 2928, 1180, 793, 808, 1306, 4479, 1672, 2922, 279, 2126, 1339, 4658, 942, 73, 973, 2573, 4538, 4125, 1749, 2480, 2816, 1349, 161, 879, 1601, 2399, 2004, 3691, 2131, 3713, 3869, 2618, 855, 1717, 2129, 3575, 3699, 2361, 2749, 3017, 2342, 2066, 2093, 2099, 2758, 2038, 1448, 2047, 1312, 3481, 1909, 4058, 4000, 2802, 44, 4513, 2509, 1156, 1596, 4652, 2767, 4524, 3154, 922, 1171, 4608, 1114, 3947, 3719, 2613, 1420, 733, 2053, 4396, 511, 1888, 2162, 1696, 4273, 3924, 458, 469, 4456, 3269, 2850, 1825, 2239, 1066, 1039, 2285, 3546, 3300, 989, 3020, 96, 1617, 3854, 439, 2465, 1958, 1360, 493, 2468, 819, 4164, 4343, 1243, 4073, 3956, 3723, 37, 3442, 1928, 4528, 4604, 133, 4040, 3271, 2101, 19, 1933, 1046, 3122, 4262, 1605, 3833, 4082, 4644, 4177, 3348, 1463, 2359, 1378, 724, 1150, 3297, 3882, 1896, 4385, 3859, 3399, 3381, 2845, 580, 1071, 1536, 2420, 4038, 2885, 2316, 4359, 1246, 507, 2175, 328, 2887, 4563, 2298, 985, 619, 2114, 3863, 2821, 389, 3766, 3339, 2210, 3387, 1230, 1845, 410, 1290, 454, 656, 3308, 101, 2584, 876, 2599, 867, 4080, 3745, 4228, 187, 1396, 940, 4611, 3850, 467, 3144, 288, 3666, 2432, 2023, 1777, 775, 3784, 3577, 896, 1092, 959, 4173, 3535, 1084, 4586, 313, 1380, 1918, 1700, 2609, 396, 114, 2921, 2815, 1716, 1447, 4651, 2052, 1824, 2464, 3441, 1604, 1895, 4358, 388, 2583, 3143, 3534, 1446, 1445, 1939, 1184, 3059, 4119, 4291, 3266, 1663, 2311, 1836, 1441, 3214, 1940, 572, 1648, 4118, 4231, 1594, 356, 836, 828, 1415, 3458, 4046, 2430, 1185, 2674, 707, 744, 2109, 3909, 1468, 1674, 645, 3658, 2796, 1686, 2689, 3060, 1087, 1945, 4656, 3320, 2329, 3677, 3097, 848, 2958, 3296, 3825, 1633, 4120, 1943, 3369, 2045, 2277, 895, 2852, 3366, 3394, 1271, 3480, 1921, 3839, 4292, 1691, 0, 2092, 1093, 3240, 3171, 3562, 2319, 3192, 2764, 1157, 2886, 4538, 4647, 644, 3957, 3659, 506, 3228, 1957, 1824, 946, 770, 2766, 209, 2408, 3735, 2898, 4589, 1496, 3971, 3511, 2101, 3940, 2609, 1114, 3328, 1600, 897, 1498, 117, 340, 4615, 1193, 2832, 1290, 882, 1368, 3446, 962, 288, 3137, 3083, 520, 3932, 3090, 2879, 1154, 3675, 2332, 4076, 3995, 701, 2076, 3062, 892, 832, 3432, 1109, 2323, 554, 2947, 3981, 215, 1037, 1774, 3515, 297, 3428, 1080, 944, 3738, 4315, 1994, 2006, 2405, 109, 1085, 3278, 2158, 1310, 4141, 1253, 4165, 4460, 2955, 1710, 195, 1375, 3452, 1204, 759, 2513, 2099, 857, 2375, 4494, 76, 1854, 1606, 3679, 3113, 729, 4221, 1348, 3175, 3268, 2001, 3219, 1408, 1359, 888, 1251, 3551, 744, 1970, 1190, 1541, 2653, 1789, 4242, 1174, 3607, 1518, 2166, 3575, 102, 2254, 930, 657, 2523, 604, 1589, 2836, 2843, 2296, 689, 2033, 2186, 3930, 4063, 4044, 1726, 1902, 3505, 664, 2568, 2131, 266, 2407, 1325, 1097, 107, 1188, 3699, 4621, 4192, 2707, 1627, 4504, 4387, 3577, 891, 1915, 1813, 271, 2646, 2753, 2358, 3212, 3439, 3490, 2519, 4357, 4456, 628, 3444, 120, 2088, 4672, 1656, 1002, 2252, 2689, 2923, 3514, 1476, 672, 3832, 4229, 842, 4378, 817, 4211, 1560, 941, 4415, 4, 160, 905, 1748, 2068, 2359, 748, 3351, 2295, 178, 1669, 1083, 1847, 3948, 163, 718, 1867, 913, 1989, 3448, 3532, 1558, 3749, 1164, 3335, 2361, 1876, 4285, 2428, 4600, 2238, 4665, 2031, 4631, 1373, 3421, 3251, 3637, 349, 1835, 2608, 2847, 383, 1030, 1316, 3427, 2617, 2118, 452, 1857, 3613, 1665, 1239, 3990, 4524, 807, 180, 1605, 1761, 699, 3044, 581, 1276, 2517, 1760, 2052, 4157, 2779, 2107, 2545, 2225, 2650, 605, 3243, 1431, 3291, 3052, 625, 2776, 1211, 1358, 514, 2885, 2174, 1263, 4081, 2888, 2763, 3970, 3136, 3980, 4164, 1347, 3574, 2567, 2752, 3831, 1846, 4630, 4523, 3290, 3830, 1815, 1171, 919, 1320, 142, 3234, 2479, 157, 630, 2580, 4594, 1482, 4560, 400, 3592, 1816, 3651, 2414, 775, 2345, 3852, 597, 1908, 4286, 1586, 678, 3540, 4008, 2697, 3870, 2138, 2730, 3741, 1966, 3548, 1687, 1172, 859, 4296, 1960, 798, 1672, 794, 130, 3826, 924, 3609, 1900, 2063, 4443, 4617, 3925, 1404, 4051, 212, 2578, 2893, 920, 955, 3796, 3158, 894, 3323, 4018, 3310, 472, 3875, 4421, 4556, 809, 3697, 1487, 3281, 3060, 4029, 1076, 777, 3779, 1321, 4362, 2794, 4092, 1416, 3116, 1274, 495, 803, 3263, 1894, 3467, 673, 1278, 1314, 268, 2167, 2911, 575, 1299, 1831, 143, 909, 3068, 812, 3304, 3434, 2132, 262, 4388, 97, 4323, 1341, 4452, 1246, 1420, 548, 42, 3441, 3935, 3728, 1618, 3235, 3716, 2712, 1066, 1751, 1930, 3360, 4213, 176, 4454, 2140, 2809, 4299, 3009, 258, 2800, 1303, 3535, 3449, 669, 1692, 2480, 3666, 2175, 1975, 1058, 2004, 3907, 3321, 384, 4350, 2267, 2220, 1631, 2431, 3179, 4571, 1326, 2202, 3099, 2054, 595, 158, 3201, 652, 641, 1999, 25, 1463, 2595, 4383, 3973, 990, 3016, 3685, 2262, 408, 3030, 1176, 784, 877, 3823, 2583, 631, 3566, 1844, 4545, 2973, 345, 2986, 3394, 4390, 1649, 3743, 445, 1282, 4031, 589, 1458, 4195, 3954, 4035, 2901, 286, 2581, 1234, 1398, 67, 1162, 2675, 2618, 22, 741, 282, 3188, 1324, 2548, 4449, 4272, 470, 3104, 2343, 2237, 3288, 3553, 4595, 3071, 1652, 403, 2839, 3197, 1371, 4130, 3079, 3820, 3560, 1872, 1753, 1415, 161, 4254, 41, 1771, 1553, 2930, 3703, 1483, 4329, 3909, 27, 1643, 278, 3568, 4070, 3426, 4585, 3124, 3039, 3381, 4386, 3763, 2783, 2630, 861, 1924, 4520, 2352, 4561, 3499, 4651, 3746, 2535, 322, 4354, 3247, 761, 2798, 179, 2062, 333, 2870, 2549, 1388, 2362, 1701, 3407, 2274, 3459, 401, 3880, 1392, 111, 162, 429, 4432, 2679, 2098, 3559, 3258, 3150, 2777, 491, 3764, 2632, 3376, 1659, 2369, 2293, 376, 3593, 359, 3315, 4260, 2785, 3409, 2173, 2142, 459, 3463, 99, 4668, 2335, 1680, 2774, 3493, 377, 3860, 2189, 4637, 320, 1817, 4151, 4440, 3327, 1462, 418, 4152, 1330, 3882, 1533, 251, 72, 952, 4016, 3213, 710, 3135, 4342, 299, 4501, 2311, 3652, 1866, 3162, 4340, 3163, 4578, 2625, 964, 4058, 127, 4053, 2701, 2746, 3706, 3878, 1479, 509, 2526, 3289, 3002, 3067, 2415, 3474, 3884, 2318, 4588, 961, 553, 4140, 728, 1517, 3504, 270, 1475, 1668, 4664, 1238, 3242, 2566, 399, 3547, 2577, 776, 1298, 3727, 668, 2053, 3822, 2900, 3287, 2929, 4519, 2273, 2292, 4636, 4500, 3001, 3546, 3506, 291, 1590, 3507, 874, 2346, 3849, 3366, 2462, 2586, 1615, 4312, 218, 2143, 726, 2743, 4540, 2156, 2341, 4657, 2571, 3842, 2996, 1712, 292, 3631, 3853, 4547, 3370, 2728, 1381, 239, 3756, 2308, 1410, 3987, 2543, 3544, 439, 2938, 984, 2895, 4344, 2980, 170, 1591, 255, 598, 1267, 733, 3317, 1580, 792, 1524, 768, 2429, 4623, 456, 3047, 4410, 4516, 3336, 2023, 3889, 1662, 2046, 3508, 2090, 1909, 2377, 4038, 225, 1784, 903, 70, 4048, 2397, 3347, 2069, 753, 334, 1636, 1951, 871, 1337, 1544, 865, 875, 1892, 4287, 4645, 1912, 3261, 1622, 386, 557, 1879, 4134, 3307, 2531, 3615, 3580, 620, 4470, 304, 1216, 2741, 2721, 2347, 2769, 1587, 3245, 1728, 206, 2907, 2470, 4198, 3899, 3275, 1624, 1566, 1074, 3833, 1794, 4404, 2196, 1054, 4239, 4488, 3850, 790, 679, 2964, 2416, 4234, 1703, 1111, 3856, 3127, 3782, 6, 4592, 3412, 3403, 801, 1090, 1563, 1772, 65, 3916, 3367, 56, 3541, 231, 705, 4021, 3145, 499, 4067, 880, 62, 1248, 591, 1148, 39, 3620, 805, 1296, 4281, 4176, 1206, 2463, 4627, 4009, 2918, 1264, 2181, 4325, 2508, 3388, 2876, 1596, 1152, 780, 3190, 1690, 4625, 3886, 4302, 1098, 95, 4568, 2587, 972, 2698, 3929, 4055, 2456, 4409, 3182, 419, 2123, 1577, 3513, 2188, 1107, 137, 1433, 1286, 541, 1178, 2671, 3414, 1616, 1236, 3871, 533, 837, 1486, 1442, 3041, 4037, 3059, 1215, 2824, 3006, 2500, 4398, 1078, 3653, 995, 2754, 3555, 2419, 4313, 2211, 2139, 539, 4309, 3918, 2652, 3762, 2119, 4331, 1634, 3967, 3643, 4641, 198, 2286, 692, 1309, 4186, 4659, 3747, 219, 746, 2731, 11, 2478, 438, 2496, 4604, 49, 4402, 430, 35, 3259, 4446, 2279, 1472, 4084, 1747, 12, 758, 3595, 2144, 3994, 3742, 3005, 2151, 1465, 2218, 3482, 2924, 2865, 2079, 1535, 1000, 169, 4469, 2936, 2120, 3692, 1180, 4298, 2846, 727, 2703, 1967, 4395, 1738, 978, 1887, 3132, 3199, 1730, 568, 369, 1670, 1512, 3771, 1812, 2906, 1470, 3359, 4066, 3478, 2744, 536, 3549, 4564, 1897, 1087, 1501, 2529, 116, 1523, 3684, 3363, 3094, 2999, 1978, 3489, 2784, 2059, 2194, 4125, 372, 4541, 885, 1688, 1594, 2164, 3811, 2060, 2991, 916, 2811, 1759, 1117, 1843, 3795, 1911, 1721, 1537, 3170, 3734, 1367, 1108, 2157, 3678, 1173, 1725, 1914, 2922, 2294, 4599, 3612, 2649, 1346, 1481, 3740, 4050, 4028, 2910, 3440, 3534, 2201, 783, 3953, 2342, 1770, 860, 1700, 1658, 3859, 4341, 2525, 2565, 290, 2995, 2979, 1661, 1543, 2740, 4238, 64, 4175, 94, 2670, 3554, 4658, 757, 4297, 4065, 4124, 1366, 782, 2669, 3772, 2969, 2704, 634, 146, 2169, 1916, 3710, 3641, 139, 4270, 3773, 1530, 2572, 1493, 1961, 4283, 1477, 4173, 4158, 3655, 2539, 4109, 2114, 933, 2355, 2440, 1743, 1849, 2083, 441, 4187, 2970, 2837, 3843, 1244, 799, 1199, 4530, 3423, 1128, 2873, 3596, 2604, 460, 4534, 2281, 4649, 4670, 2484, 1762, 1258, 844, 2705, 3148, 2997, 4251, 1673, 2975, 1755, 1942, 515, 2394, 3297, 4566, 411, 2592, 4189, 3804, 2497, 105, 840, 922, 3345, 635, 3812, 1713, 4103, 795, 275, 2664, 1222, 1717, 681, 365, 566, 4601, 1575, 528, 3284, 1202, 4128, 4400, 1271, 2065, 147, 3751, 293, 3723, 131, 4496, 1520, 2628, 570, 3034, 1489, 19, 2642, 637, 1356, 1613, 2871, 3055, 2227, 4005, 2420, 2170, 715, 3632, 2443, 3827, 2559, 1722, 4147, 4491, 4352, 4071, 3938, 639, 2454, 2486, 3026, 2791, 2821, 2855, 2600, 2825, 1917, 1694, 3854, 1874, 925, 123, 3194, 1134, 966, 3946, 1864, 1698, 3203, 388, 1033, 150, 4230, 4611, 1803, 2208, 423, 3711, 735, 4548, 2327, 3610, 3635, 3475, 1829, 788, 2325, 327, 89, 1056, 2677, 822, 2805, 927, 1201, 1513, 1985, 1554, 3642, 3527, 3371, 4132, 1901, 3406, 3477, 450, 1818, 2300, 3479, 1044, 4582, 1422, 4586, 2368, 1889, 1820, 3156, 1032, 4428, 140, 519, 2729, 3888, 2064, 2383, 4082, 1508, 4246, 697, 1506, 3074, 3032, 1226, 853, 493, 4408, 458, 3294, 4205, 108, 4271, 691, 1382, 623, 4444, 3495, 2491, 2488, 2153, 3585, 4153, 2224, 3293, 2103, 2714, 1011, 4343, 244, 4156, 4635, 1742, 3774, 203, 240, 1400, 4618, 1396, 3003, 4425, 3838, 4227, 192, 2640, 2656, 513, 2152, 1956, 2266, 779, 852, 3485, 3836, 1531, 2036, 3757, 3808, 3926, 2236, 3914, 3369, 4468, 2635, 453, 3714, 4311, 4414, 3881, 1345, 4633, 3999, 1383, 2016, 1869, 2573, 3390, 2309, 1972, 1405, 1827, 3387, 1403, 1526, 2477, 1737, 1273, 4197, 1863, 3151, 2749, 1195, 1169, 4225, 2400, 3020, 1494, 1354, 1411, 1571, 4052, 406, 834, 2597, 656, 2534, 1886, 2662, 1810, 4335, 1137, 2915, 4056, 2161, 4332, 4559, 3835, 1962, 3300, 3988, 2314, 213, 3961, 2413, 732, 2663, 2716, 1092, 208, 1289, 831, 1084, 1853, 1788, 4062, 3576, 2251, 747, 4284, 451, 2544, 3979, 2579, 2137, 3924, 3280, 267, 547, 2799, 4570, 3029, 1457, 469, 4253, 2782, 1387, 2631, 3492, 709, 1478, 1237, 3545, 2570, 2894, 2022, 870, 303, 2195, 1562, 1295, 4301, 540, 994, 1308, 1746, 3691, 1469, 2058, 3169, 3533, 4174, 138, 440, 1257, 921, 1270, 4004, 2599, 2207, 1984, 1031, 4204, 4634, 3484, 2015, 2399, 4558, 2250, 3491, 3168, 3167, 4159, 1945, 2939, 1732, 956, 3205, 2890, 1352, 3164, 3788, 4248, 3139, 2659, 183, 3364, 3695, 618, 2819, 1550, 4160, 2787, 3656, 4596, 985, 1123, 3797, 4294, 53, 1363, 4419, 1808, 2450, 30, 1968, 3037, 167, 2913, 2338, 4484, 3523, 1946, 2043, 2540, 4506, 2896, 2199, 3159, 4178, 2288, 4042, 2780, 3719, 1318, 3985, 2590, 4365, 1060, 3216, 3775, 2504, 2725, 2940, 2760, 4110, 2844, 4345, 815, 895, 2563, 3845, 3673, 3392, 3057, 2638, 3223, 3464, 828, 1932, 646, 2257, 1676, 2853, 1733, 982, 2115, 1937, 2981, 713, 3324, 347, 959, 2667, 1806, 3862, 1436, 3373, 3383, 4367, 906, 3976, 4605, 2960, 572, 957, 1836, 934, 1578, 171, 1064, 4019, 448, 2717, 3356, 4073, 2966, 560, 611, 2239, 1052, 4106, 3271, 4450, 467, 525, 3206, 2384, 2356, 357, 1592, 2020, 3311, 78, 4255, 4476, 4465, 824, 2944, 1528, 2231, 3814, 3622, 3732, 2550, 863, 2710, 2891, 1890, 2441, 1445, 256, 1447, 473, 901, 1538, 2276, 685, 2269, 3295, 1026, 4314, 2113, 2040, 3400, 3112, 1552, 3594, 1353, 3007, 1744, 4479, 599, 486, 3876, 1142, 2350, 1336, 4441, 4119, 3152, 2038, 4614, 559, 4163, 3841, 843, 981, 1797, 3165, 3688, 1850, 1973, 1268, 329, 4422, 1186, 3885, 1214, 422, 556, 2868, 2831, 407, 1285, 4155, 1765, 855, 4532, 4121, 3789, 2931, 2084, 3965, 734, 3178, 4557, 228, 3102, 2719, 3640, 3334, 2745, 2739, 617, 550, 847, 4437, 1280, 2271, 3173, 4249, 2086, 442, 1639, 3318, 4304, 810, 1998, 2889, 4322, 4591, 821, 4154, 3339, 3530, 3897, 3486, 2554, 3571, 3049, 2155, 3140, 1189, 4188, 1339, 1581, 2147, 3698, 2097, 3683, 3028, 2817, 1040, 1331, 324, 2723, 3942, 306, 4487, 4609, 2623, 1766, 2660, 197, 2971, 2253, 793, 69, 1488, 2943, 4653, 676, 3951, 343, 1361, 3225, 2191, 234, 1466, 4262, 2117, 3781, 1467, 184, 194, 2838, 2495, 1525, 2184, 3282, 1145, 173, 58, 1572, 3122, 1858, 4194, 3522, 381, 3183, 1782, 1021, 3314, 624, 3365, 4529, 3844, 4673, 769, 1192, 3061, 2404, 4493, 1540, 2185, 4503, 1655, 2067, 2360, 2616, 2778, 3969, 156, 2696, 4442, 3696, 1277, 1245, 3008, 2430, 2261, 4030, 4448, 1414, 4385, 2869, 490, 1679, 4015, 3705, 1667, 4499, 2340, 2937, 4515, 1635, 619, 1793, 800, 3619, 4624, 1432, 1077, 2285, 1471, 2935, 1811, 3488, 1720, 2909, 4237, 3709, 1848, 2483, 104, 4127, 3054, 2820, 4610, 1200, 1819, 457, 243, 778, 3998, 1168, 2160, 4061, 1386, 1468, 2249, 2818, 4483, 2503, 1675, 2959, 466, 862, 1551, 980, 4531, 2270, 3048, 2622, 3780, 3313, 2695, 4514, 4126, 465, 1682, 3011, 1986, 4208, 1131, 4086, 3265, 1683, 2178, 4161, 4463, 3424, 1434, 4411, 1992, 1322, 4639, 1343, 1780, 1104, 3599, 764, 312, 4000, 4274, 3905, 3349, 1801, 3012, 2520, 2788, 413, 1129, 2515, 4517, 931, 4363, 390, 246, 4574, 4579, 1883, 530, 3085, 2862, 3602, 1859, 2387, 551, 1987, 786, 3657, 3319, 2874, 3072, 3337, 3087, 2795, 608, 2612, 1015, 2903, 3864, 2657, 2858, 4396, 14, 16, 577, 3669, 4209, 416, 4597, 1982, 3597, 425, 2024, 502, 4093, 1208, 3456, 355, 2108, 3911, 723, 2681, 3528, 392, 4307, 4090, 204, 1132, 1334, 986, 2536, 2605, 2297, 3890, 2466, 1417, 3800, 1, 1160, 3256, 2229, 4433, 4375, 100, 3497, 4393, 3959, 2283, 4087, 1022, 1124, 1798, 461, 189, 1663, 4426, 3117, 2988, 2093, 1922, 3962, 1379, 3590, 253, 4101, 1062, 2636, 478, 50, 3266, 436, 3798, 2247, 4535, 2747, 2047, 2637, 1275, 1505, 1094, 2322, 4034, 2418, 2035, 2494, 4666, 2111, 1450, 4337, 4290, 1684, 433, 4295, 4083, 2282, 200, 3509, 574, 496, 1856, 3241, 4269, 2042, 1981, 4654, 2245, 3501, 1715, 4149, 484, 1389, 2179, 2928, 54, 1455, 4650, 2217, 2091, 257, 804, 3155, 3172, 3588, 1261, 2222, 4472, 3331, 2434, 627, 2379, 655, 951, 4162, 2849, 1364, 2501, 4671, 2334, 1910, 3690, 3264, 2009, 3563, 988, 1228, 3023, 2750, 202, 4317, 1881, 694, 2473, 4379, 4464, 3161, 4420, 2530, 2485, 2039, 2378, 90, 1895, 3130, 2320, 2684, 3847, 2949, 711, 2304, 141, 2655, 3340, 113, 1250, 3425, 2078, 1809, 3704, 1763, 2734, 4039, 4045, 3468, 1839, 3193, 3358, 432, 563, 537, 2861, 3078, 44, 1814, 3755, 3296, 1435, 3589, 2451, 2233, 1259, 2316, 226, 1099, 674, 3903, 2765, 997, 869, 115, 2041, 3089, 2972, 1441, 3837, 3950, 3538, 4412, 4660, 31, 3700, 845, 949, 1785, 4663, 1279, 3253, 1158, 2793, 2145, 3420, 3883, 4123, 52, 2611, 1823, 339, 700, 1993, 856, 1969, 688, 2706, 2087, 904, 1163, 1315, 2051, 2887, 3233, 3539, 1899, 4555, 3466, 1340, 2808, 2219, 3015, 444, 1323, 1871, 3038, 2061, 3149, 4667, 71, 2700, 269, 2291, 4539, 3543, 3046, 752, 3614, 1073, 3411, 1147, 3189, 1106, 2499, 4640, 4445, 168, 1511, 2998, 3794, 4049, 1542, 2168, 2439, 4648, 3803, 3283, 1612, 3025, 149, 2804, 2367, 492, 1010, 1955, 1344, 2748, 2914, 1852, 4252, 1745, 2398, 3694, 2912, 3215, 645, 3975, 3270, 3731, 3399, 3840, 1764, 4436, 2553, 4486, 4261, 1781, 3968, 2339, 2482, 1674, 4085, 3348, 2386, 576, 4089, 3958, 477, 4336, 483, 654, 2472, 112, 3754, 3949, 338, 3014, 1105, 1009, 4485, 337, 2976, 2301, 2070, 2445, 1300, 4430, 3660, 1312, 1786, 3768, 1068, 2620, 1041, 1556, 125, 2977, 181, 3600, 1925, 3524, 362, 1756, 3080, 754, 2732, 1832, 80, 507, 3893, 373, 3302, 3922, 260, 3125, 87, 2829, 2302, 2010, 765, 3119, 1947, 2812, 1943, 1287, 335, 2074, 144, 3076, 3229, 937, 1095, 427, 2527, 545, 1384, 3766, 4096, 2071, 2104, 313, 4358, 2044, 4527, 516, 4510, 1637, 378, 910, 1035, 1958, 223, 2626, 4474, 4267, 522, 2214, 1927, 300, 2446, 848, 4001, 587, 2541, 4318, 2395, 1653, 1952, 4458, 3069, 9, 1825, 2402, 2437, 1438, 3341, 4114, 1739, 2424, 2993, 1301, 2056, 4275, 1963, 4507, 4655, 3298, 1429, 872, 1242, 813, 2465, 947, 2373, 2546, 1708, 1197, 4662, 434, 248, 2759, 4431, 241, 3906, 2206, 2897, 3098, 4567, 690, 1338, 948, 3305, 4013, 771, 4217, 1427, 4007, 2427, 75, 4669, 1822, 2834, 3661, 193, 3350, 3134, 2200, 3166, 412, 4526, 1545, 838, 3435, 3396, 2767, 3618, 4381, 1049, 2452, 3380, 4306, 3218, 1754, 1313, 4403, 1802, 1796, 3160, 1182, 2593, 3786, 866, 479, 2133, 4224, 210, 3431, 1565, 4236, 2305, 1935, 2032, 332, 3770, 1787, 103, 3013, 1027, 4179, 1509, 4190, 4607, 876, 2786, 263, 1608, 2409, 524, 1750, 2589, 677, 455, 527, 4105, 1449, 3769, 2363, 2521, 1220, 2289, 3872, 3805, 1181, 1893, 1448, 4389, 2449, 3736, 943, 740, 1633, 4310, 3521, 3410, 4481, 91, 1069, 4277, 2789, 1559, 4043, 4399, 2498, 615, 4288, 330, 98, 3043, 2899, 2538, 1317, 722, 1196, 2926, 2693, 4136, 229, 2621, 818, 414, 1183, 2781, 1444, 106, 569, 4646, 1057, 4324, 4245, 4590, 868, 280, 3983, 3817, 2012, 3095, 1008, 3531, 1042, 38, 1130, 264, 3720, 1484, 841, 4439, 1913, 4003, 1342, 3227, 1497, 4075, 3737, 2512, 3550, 2842, 4620, 3443, 3, 1557, 382, 2516, 1262, 1319, 1585, 923, 3874, 3262, 96, 4453, 4349, 3972, 1648, 281, 3819, 4584, 2797, 3558, 3462, 1532, 126, 1516, 4518, 725, 3986, 4622, 3346, 3306, 1623, 5, 1247, 1151, 3512, 2823, 3966, 34, 1534, 368, 3362, 1116, 1480, 2978, 633, 932, 4533, 2591, 1574, 636, 2453, 387, 2676, 1421, 1225, 2102, 512, 4413, 1862, 4334, 830, 1456, 993, 3483, 182, 3036, 4364, 827, 4366, 1051, 3813, 2112, 558, 1284, 549, 3896, 3941, 233, 380, 2615, 1666, 3708, 4482, 4207, 4273, 3601, 13, 391, 3496, 1061, 2110, 1714, 626, 1880, 2654, 43, 1440, 2610, 2807, 1146, 2366, 4435, 3753, 1555, 86, 3765, 1926, 2423, 247, 1821, 3217, 331, 4104, 4480, 4135, 1007, 3442, 3461, 1115, 992, 4206, 85, 45, 1452, 2735, 46, 2028, 3525, 360, 4575, 3644, 3776, 2757, 796, 1390, 3308, 1877, 3936, 1024, 3329, 3519, 1138, 3759, 352, 4200, 2850, 1453, 164, 363, 1028, 4580, 3920, 2505, 1406, 276, 3480, 2532, 488, 3729, 83, 1601, 4143, 2127, 4098, 835, 4184, 1332, 2736, 1424, 1757, 2389, 1884, 4521, 2726, 1940, 2665, 1920, 3616, 1100, 1619, 4257, 898, 1005, 4542, 3186, 396, 2802, 3210, 47, 3254, 3081, 3564, 531, 1394, 2941, 2049, 1223, 542, 3581, 4551, 3236, 1904, 1499, 2772, 3110, 2026, 2459, 2687, 2017, 2029, 3065, 755, 1121, 3086, 4457, 2761, 1546, 1718, 3050, 621, 4509, 3717, 152, 118, 1777, 965, 1461, 2349, 3934, 3915, 3526, 3964, 2733, 4438, 2863, 1377, 4111, 3648, 682, 404, 4471, 2762, 2713, 2213, 341, 2951, 890, 3375, 2193, 708, 979, 361, 1939, 1833, 4168, 3603, 703, 2845, 2246, 366, 4327, 305, 1165, 1067, 4629, 4616, 1950, 2226, 2709, 2927, 1219, 420, 4576, 1212, 81, 1401, 1860, 518, 4346, 1657, 567, 2034, 1217, 2374, 1752, 2278, 1194, 155, 1954, 2422, 749, 661, 2336, 3645, 1103, 508, 4120, 2388, 3354, 816, 3689, 4602, 4080, 2742, 2280, 1931, 4392, 2833, 1102, 394, 773, 2234, 1241, 1047, 3777, 2121, 3894, 431, 552, 3639, 896, 4382, 1576, 3292, 2722, 51, 3361, 2243, 1291, 2556, 2411, 1705, 2306, 3869, 4632, 2758, 2364, 374, 1696, 1988, 2624, 2564, 4247, 529, 4266, 2348, 4026, 4214, 3681, 883, 2216, 185, 2135, 3952, 93, 3605, 797, 3386, 3303, 1702, 787, 421, 3846, 279, 3285, 819, 2770, 474, 177, 1120, 1369, 3455, 1842, 2433, 665, 1140, 265, 1391, 1896, 3923, 1167, 3658, 1599, 3674, 1079, 1203, 887, 1588, 1187, 4455, 940, 3447, 2607, 580, 2884, 1170, 1907, 129, 3309, 494, 261, 4212, 3320, 2594, 3393, 21, 4129, 4069, 3246, 2678, 2141, 1329, 963, 4139, 3286, 217, 2307, 767, 4047, 1878, 3898, 3126, 879, 2875, 2122, 3058, 4330, 4401, 2864, 1729, 1522, 2810, 2648, 289, 2968, 4108, 2603, 4565, 565, 18, 3937, 1697, 88, 1043, 3073, 2223, 2639, 3713, 1272, 2661, 207, 4569, 4300, 4203, 3138, 29, 3984, 3222, 3372, 610, 1527, 1025, 2037, 2830, 2738, 3338, 323, 3224, 4193, 2066, 4014, 2908, 2248, 3010, 311, 3084, 2857, 2680, 4374, 252, 2493, 2244, 3330, 201, 2303, 2860, 3088, 4122, 3465, 1072, 148, 3839, 2471, 2619, 259, 544, 521, 4113, 4661, 74, 3379, 1934, 454, 3520, 2925, 2011, 2841, 2796, 367, 829, 3707, 3752, 1451, 4199, 4183, 2801, 2686, 3933, 707, 1218, 660, 1240, 3868, 92, 1139, 1906, 766, 564, 609, 2492, 1933, 3867, 294, 4170, 3900, 1790, 1304, 3343, 3091, 236, 174, 1293, 738, 295, 2673, 3760, 2633, 3120, 750, 2613, 658, 647, 186, 3724, 600, 3276, 2081, 3536, 3625, 2880, 3018, 3248, 1603, 666, 4171, 4040, 353, 2371, 1948, 2329, 1016, 4642, 2258, 4078, 132, 3792, 1625, 1019, 3450, 1126, 1155, 3664, 2916, 2381, 1996, 3901, 4347, 4201, 719, 2813, 4180, 2904, 3105, 1677, 3578, 4497, 1045, 1567, 3784, 670, 318, 3676, 1255, 1991, 2073, 4550, 1791, 325, 2851, 593, 1944, 1443, 3865, 2353, 2854, 1834, 1521, 1727, 1075, 2720, 1693, 4478, 2333, 614, 886, 2392, 3231, 1305, 272, 1454, 245, 1288, 989, 2658, 3816, 1734, 4241, 2629, 1179, 3834, 1792, 2481, 2756, 4077, 4264, 3401, 504, 3606, 3344, 1870, 165, 3627, 336, 3748, 2859, 629, 983, 839, 571, 435, 1795, 3638, 3667, 4232, 3996, 4025, 4059, 3791, 4027, 3092, 2835, 364, 3045, 2075, 1281, 4397, 2265, 2116, 443, 3035, 2840, 4405, 1547, 2176, 1307, 702, 1089, 2958, 3385, 1582, 237, 1888, 1029, 3503, 145, 166, 15, 2992, 1938, 3502, 1490, 1232, 2197, 3873, 1976, 4011, 2077, 2331, 2651, 3144, 2694, 175, 61, 4581, 616, 3077, 4619, 17, 1610, 2982, 3470, 20, 2187, 1055, 2547, 1059, 3557, 3063, 2984, 4356, 2172, 915, 1294, 1681, 3921, 395, 3230, 3569, 578, 2644, 714, 1851, 2643, 4279, 4240, 2354, 2005, 1651, 893, 1621, 4490, 684, 1260, 739, 1841, 2506, 1778, 938, 36, 3670, 3668, 3325, 119, 638, 3398, 4489, 3267, 3908, 2150, 833, 1413, 643, 1113, 2878, 296, 1374, 1407, 2522, 1096, 2518, 4210, 912, 348, 698, 1357, 3829, 3851, 1671, 3322, 3115, 3433, 1929, 2003, 24, 344, 2674, 3196, 277, 321, 428, 3408, 417, 4577, 960, 3821, 1614, 238, 791, 902, 385, 2469, 1110, 498, 2507, 3181, 3040, 3761, 4603, 3481, 3131, 2528, 2990, 4598, 2524, 2668, 3654, 2872, 2393, 680, 3033, 4351, 3945, 2324, 2299, 696, 3584, 4226, 2634, 2476, 2533, 2715, 546, 1561, 1983, 3787, 1807, 3718, 3056, 3861, 2965, 823, 2268, 4118, 555, 3333, 820, 1039, 342, 3121, 4502, 489, 3487, 1385, 464, 3598, 1882, 3863, 3910, 2228, 1378, 2417, 1980, 2221, 3022, 2948, 562, 114, 3419, 1898, 751, 1611, 3730, 482, 3767, 3301, 426, 4473, 1437, 1707, 4006, 1048, 4235, 2588, 1632, 721, 3982, 2511, 3818, 33, 1861, 2614, 2365, 84, 3758, 4097, 3185, 2025, 1460, 3374, 2708, 2421, 772, 1704, 2134, 2432, 2883, 216, 2602, 3221, 4373, 73, 659, 1292, 1602, 2380, 2072, 2391, 503, 3790, 3384, 3143, 2171, 683, 1112, 23, 3180, 3583, 1038, 3418, 32, 4372, 4371, 648, 3107, 4144, 2866, 2105, 4406, 4094, 2474, 4368, 308, 716, 4338, 3857, 1350, 4572, 221, 1775, 4023, 2690, 649, 3991, 187, 1070, 2128, 2255, 314, 762, 1209, 2489, 907, 2962, 3633, 1184, 3128, 4243, 1327, 4116, 3516, 974, 59, 3108, 3208, 3725, 998, 4099, 3377, 4359, 662, 3457, 534, 3977, 242, 2444, 487, 3783, 850, 2203, 4417, 298, 3687, 3919, 4145, 3956, 601, 4046, 836, 1965, 2045, 3750, 356, 199, 4606, 4265, 3828, 4423, 7, 1979, 3100, 1800, 3429, 2816, 4057, 2867, 2126, 3277, 3103, 4185, 1868, 4528, 1510, 2109, 3866, 2961, 370, 2560, 4583, 4593, 851, 2055, 481, 1081, 4167, 1735, 2106, 3000, 2082, 2724, 1333, 2205, 517, 1609, 3912, 4562, 573, 4169, 1723, 1768, 3413, 2192, 596, 4467, 945, 1630, 1689, 4407, 3570, 3537, 1515, 2737, 3184, 4511, 1229, 724, 969, 958, 1977, 4148, 2672, 3404, 326, 159, 250, 3739, 2014, 3904, 4095, 3064, 3626, 2574, 1425, 2575, 1638, 2048, 2682, 3445, 1837, 3436, 4492, 2163, 802, 3274, 3202, 4613, 4316, 2692, 128, 2475, 4215, 2881, 970, 1758, 1646, 379, 2272, 3529, 2458, 935, 603, 4353, 3198, 1091, 1719, 653, 351, 1995, 2125, 2953, 4369, 211, 3019, 3133, 2390, 1491, 911, 2315, 393, 2344, 1579, 1716, 4072, 4033, 1564, 2410, 642, 2920, 2007, 1018, 606, 309, 4137, 3249, 471, 1885, 4380, 1036, 1397, 4308, 3913, 172, 4537, 3939, 3931, 1773, 1709, 2000, 929, 2406, 3438, 4377, 717, 3250, 1604, 2775, 4522, 774, 1959, 3157, 4091, 811, 1065, 1974, 640, 4544, 66, 402, 26, 3745, 110, 4259, 3326, 4339, 2317, 667, 2461, 2727, 3316, 224, 3260, 205, 4233, 4020, 2180, 2455, 1485, 3917, 437, 1464, 977, 1086, 3810, 2921, 3858, 1365, 4172, 3422, 1941, 1221, 2627, 4146, 1133, 1828, 449, 1507, 2487, 4424, 3368, 1402, 2596, 731, 3279, 302, 2598, 1351, 1362, 4041, 3672, 2666, 3355, 4475, 2275, 1335, 1213, 2718, 4321, 3027, 675, 57, 1539, 4384, 2934, 2159, 4513, 1779, 4573, 1014, 354, 1159, 1921, 2321, 4268, 3587, 987, 2683, 3357, 996, 2792, 3232, 3542, 3802, 3974, 476, 1311, 3892, 936, 222, 2401, 2372, 4216, 3617, 3430, 523, 942, 2537, 867, 4074, 1647, 2822, 511, 232, 2806, 991, 3518, 4142, 1004, 2771, 1776, 2950, 1949, 154, 1101, 2555, 2215, 3454, 2606, 4138, 2967, 28, 2856, 4112, 706, 235, 3017, 3663, 1254, 613, 4263, 4024, 1088, 2330, 2983, 1620, 1412, 1928, 497, 2298, 3332, 561, 2510, 2601, 3417, 4022, 973, 3686, 2815, 4166, 1629, 2013, 2691, 2124, 1017, 3437, 4258, 3809, 301, 4512, 3891, 1003, 612, 1628, 2826, 4218, 3146, 686, 2263, 583, 4461, 2827, 3352, 650, 953, 4643, 2557, 899, 3153, 2447, 1118, 2467, 2932, 2240, 134, 1918, 1473, 500, 742, 409, 4553, 2956, 4219, 3701, 3992, 1569, 2259, 3693, 1006, 2080, 849, 1548, 1418, 1050, 1053, 3053, 1695, 4291, 4068, 136, 3031, 3573, 1711, 3147, 1936, 188, 4525, 4079, 4278, 4543, 4292, 4002, 1767, 3801, 2154, 4107, 371, 3855, 4060, 881, 1175, 1177, 1741, 196, 687, 1573, 1071, 3142, 133, 1583, 3187, 1660, 588, 2337, 2, 1514, 3272, 415, 1875, 3877, 63, 1549, 785, 586, 1376, 2264, 2457, 2129, 3721, 3793, 3469, 397, 3647, 2542, 316, 1161, 2287, 4451, 3402, 926, 854, 1249, 37, 878, 463, 3453, 584, 2162, 2256, 2954, 1626, 1355, 2803, 914, 4319, 4191, 3257, 3093, 468, 2502, 124, 1423, 592, 2204, 3824, 1641, 1205, 4462, 1598, 315, 3416, 1020, 3943, 3211, 3825, 2396, 2641, 2230, 3500, 526, 3604, 3195, 3671, 1149, 3273, 2584, 826, 760, 2828, 1595, 763, 579, 3451, 1370, 48, 1736, 1654, 3024, 4434, 737, 3207, 3141, 1135, 3415, 40, 2852, 632, 1645, 2514, 3353, 4133, 1210, 2585, 1127, 3391, 3255, 1426, 1953, 4355, 4376, 121, 2385, 3397, 967, 4536, 3621, 1783, 3567, 1805, 2100, 651, 4054, 2490, 3682, 1156, 3510, 3082, 214, 4459, 3174, 101, 2130, 2357, 4228, 3947, 1372, 806, 3051, 1845, 3650, 858, 954, 4361, 908, 3715, 3665, 3200, 3565, 1233, 3070, 4328, 3498, 3879, 358, 4150, 1865, 3473, 1297, 3848, 4546, 1266, 2376, 4644, 3244, 2963, 230, 2917, 3928, 532, 538, 10, 3004, 4394, 4563, 1593, 1724, 1699, 4064, 4282, 1198, 2974, 274, 4495, 2558, 122, 3634, 3405, 2382, 3494, 1395, 2235, 1826, 405, 3960, 2136, 2021, 1269, 3204, 4293, 4177, 2562, 346, 447, 77, 900, 1141, 1185, 227, 1997, 2096, 2942, 1144, 2403, 4447, 2284, 3997, 3312, 4638, 389, 607, 1207, 3799, 2987, 1504, 1855, 3154, 2008, 3129, 1838, 3902, 3252, 2050, 2290, 2438, 3214, 4088, 4429, 79, 3075, 1034, 8, 2464, 4012, 3395, 4223, 1607, 2448, 3042, 4244, 3226, 4348, 1150, 1224, 3895, 1439, 3460, 1023, 82, 4256, 1903, 151, 2212, 4628, 2277, 4391, 2242, 3680, 1119, 939, 1328, 2647, 4202, 310, 543, 2685, 3342, 3624, 1125, 317, 4477, 2755, 4231, 1306, 4010, 3556, 1650, 2149, 3114, 2468, 3944, 4117, 3021, 720, 2882, 3582, 220, 4115, 4416, 1799, 480, 4466, 249, 4612, 350, 2919, 928, 3744, 976, 730, 2933, 475, 3517, 3662, 2814, 582, 4552, 3572, 1740, 585, 462, 1640, 825, 1644, 1804, 3649, 1265, 273, 446, 1503, 4222, 2241, 2148, 975, 1502, 4181, 3471, 3237, 3628, 2425, 917, 190, 2435, 2945, 284, 2209, 3806, 2182, 2699, 1283, 4182, 1349, 135, 3096, 60, 1519, 2905, 4289, 1905, 3927, 2994, 1230, 1664, 398, 1529, 4505, 424, 1428, 4326, 1231, 4032, 3472, 3176, 1919, 4320, 3109, 4017, 3106, 2412, 1500, 3239, 1302, 4280, 4427, 2085, 2232, 1584, 3712, 1706, 2509, 283, 590, 3238, 3269, 1474, 846, 3209, 1013, 1678, 1001, 2773, 1536, 2057, 2177, 3118, 1393, 3815, 968, 736, 1685, 3389, 3097, 1459, 3629, 2002, 501, 1749, 3726, 808, 3579, 2790, 3111, 950, 4276, 1166, 2989, 3586, 3623, 2561, 4549, 602, 2877, 3608, 4196, 2426, 3220, 743, 3123, 999, 1136, 4498, 2552, 2027, 2370, 1964, 3646, 2094, 3561, 3733, 2848, 2328, 1143, 1597, 1419, 3955, 918, 1409, 410, 3382, 4100, 4305, 1046, 1840, 2460, 2095, 4508, 510, 1923, 693, 2551, 505, 3611, 1227, 1153, 2985, 4036, 191, 1360, 4554, 4333, 3378, 4370, 1568, 1012, 2688, 1990, 4656, 4608, 3963, 153, 864, 2190, 3636, 4587, 781, 4418, 2902, 2436, 889, 2957, 2952, 4360, 2312, 3785, 307, 2018, 1642, 3299, 695, 1380, 4652, 2711, 704, 3476, 3101, 3191, 1495, 287, 2946, 1252, 4220, 2165, 663, 2645, 671, 1082, 2030, 3989, 1430, 2751, 3591, 1686, 2892, 3778, 1830, 1617, 1691, 594, 2582, 285, 3552, 3702, 2351, 3458, 375, 319, 2310, 3066, 2576, 873, 3630, 254, 2089, 1891, 2768, 789, 55, 4626, 971, 1235, 2210, 745, 3993, 2702, 535, 884, 3677, 1769, 756, 1492, 1243, 4250, 4102, 3722, 2442, 1873, 2326, 4131, 3887, 622, 1399, 3807, 1971, 1570, 2313, 3978, 2569, 1256, 1731, 1122, 2198, 814, 712, 1063, 2019, 1446, 485, 328, 3177, 4303, 2146, 68, 2183, 1191, 2260
                               };



int N = 2337;
int no_of_levels = 3;
int Lvspp = 0;


float L[2][3] = {{0.0, 0.0, 0.0},
                 {1554.0, 3108.0, 3728.0}};

float PL[2][3] = {{0.0, 4.0, 9.0},
                  {2.0, 7.0, 10.0}};
int maxiter = 2;
int N1 = 0;
int SDCorMSC = -1;


//////////////////////////////////////////////
//MODIFIED NEW MSD HARD FUNCTION///
////////////////////////////////////////////

/* NOT YET ENOUGH MODFICATION DONE */


#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>


#define NARGS_RHS_STR "9"
#define NARGS_RHS 9
#define PROGNAME "msd_hard"
#define PRBS_INIT(reg) reg = 511;
#define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1)
#define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1)


void msd_hard_new_modified (int *result)
{


   float *received_real, *received_imag, *received, *first_received, *L1, *L2, *L1_real, *L2_real, *L1_imag, *L2_imag;
   float *PL1, *PL2, *PL1_real, *PL2_real, *PL1_imag, *PL2_imag, L_dummy[3] = {0, 0, 0};
   int *Deinterleaver;
   float *metric_real, *metric_imag, *metric, *first_metric, closest_one, closest_zero, sample, *llr, dist;
   //float variance, weightsum;
   char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *hardpoints_ptr, *lastiter, *infoout[3];
   int m, n, iteration, diff;
   int sample_index, rp_real[3], rp_imag[3], *rp, level, subset_point, no_of_bits, error, msd_mem_size, viterbi_mem_size;
   //int PRBS_reg;
   int HMmix = 0, HMsym = 0;
//#ifdef CONSIDERING_SNR
   float *signal_to_noise_ratio;
   float SNR;
//#endif
   int two_m_HMmix, one_m_HMmix;

   received_real = &received1[0];
   received_imag = &received1[2337];
//L1 = &L[0][0];
//L2 = L1 + no_of_levels;
//PL1 = &PL[0][0];
//PL2 = PL1 + no_of_levels;
   signal_to_noise_ratio = &signal_to_noise_ratio1[0];
   Deinterleaver = &Deinterleaver1[0];



//new
   L1_real = &L[0][0];
   L2_real = L1_real + no_of_levels;
   if (HMmix)
   {
      L1_imag = L2_real + no_of_levels;
      L2_imag = L1_imag + no_of_levels;
   }
   else
   {
      L1_imag = L_dummy;
      L2_imag = L_dummy;
   }

   PL1_real = &PL[0][0];
   PL2_real = PL1_real + no_of_levels;
   PL1_imag = PL2_real + no_of_levels;
   PL2_imag = PL1_imag + no_of_levels;


   two_m_HMmix = (2 - HMmix);
   one_m_HMmix = (1 - HMmix);



   /* memory allocation and initialization: */
   no_of_bits = 0;
   for (level = 0; level < no_of_levels; level++)
   {
      no_of_bits += (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level] + (int)L2_imag[level] + 6;
   }

   msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char);
   viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char);

   if (received_imag == NULL)
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size + N * sizeof(float));

      received_imag = (float *) (memory_ptr + viterbi_mem_size + msd_mem_size);
      memset (received_imag, 0, N * sizeof(float));
   }
   else
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size);
   }




   viterbi_mem = memory_ptr;
   msd_mem = memory_ptr + viterbi_mem_size;

   llr = (float *) msd_mem;
   hardpoints = (char *) (msd_mem + 2 * N * sizeof(float));
   lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char));
   infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char));
   infoout[1] = 0;
   for (m = 1; m < no_of_levels; m++)
   {
      infoout[m] = infoout[m-1] + (int)L1_real[m-1] + (int)L2_real[m-1] + 6 + (int)L1_imag[m-1] + (int)L2_imag[m-1] + 6;
   }
   memset(hardpoints, 0, 2 * N * sizeof(char));




   /* choosing partitioning type: */
   if (no_of_levels == 3)
   {
      if ((Lvspp != 0) && HMmix)
      {   /* HMmix 64-QAM */
         metric_real = partitioning[1];
         metric_imag = partitioning[0];
         rp_real[0] =        (N - 12) - RY[(int)PL2_real[0]] *        ((N - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = ((N - N1) - 12) - RY[(int)PL2_real[1]] * (((N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = ((N - N1) - 12) - RY[(int)PL2_real[2]] * (((N - N1) - 12) / RY[(int)PL2_real[2]]);
         rp_imag[0] = ((N - N1) - 12) - RY[(int)PL2_imag[0]] * (((N - N1) - 12) / RY[(int)PL2_imag[0]]);
         rp_imag[1] = ((N - N1) - 12) - RY[(int)PL2_imag[1]] * (((N - N1) - 12) / RY[(int)PL2_imag[1]]);
         rp_imag[2] = ((N - N1) - 12) - RY[(int)PL2_imag[2]] * (((N - N1) - 12) / RY[(int)PL2_imag[2]]);

      }
      else if (Lvspp != 0)
      {    /* HMsym 64-QAM */
         HMsym = 1;
         metric_real = partitioning[1];
         metric_imag = partitioning[1];
         rp_real[0] =        (2 * N - 12) - RY[(int)PL2_real[0]] *        ((2 * N - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = (2 * (N - N1) - 12) - RY[(int)PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[2]]);
      }
      else
      {        /* SM 64-QAM */
         metric_real = partitioning[0];
         metric_imag = partitioning[0];
         rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = (2 * (N - N1) - 12) - RY[(int)PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[2]]);
      }

   }
   else if (no_of_levels == 2)
   {    /* SM 16-QAM */
      rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
      rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
      metric_real = partitioning[2];
      metric_imag = partitioning[2];
   }
   else
   {         /* SM 4-QAM */
      rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
      metric_real = partitioning[3];
      metric_imag = partitioning[3];
   }
   if (!SDCorMSC)
   {
      rp_real[0] = -12;
      rp_real[1] = -12;
      rp_real[2] = -12;
   }
   if (Lvspp != 0)
   {
      L1_real[0] = 0;
      L2_real[0] = (float) Lvspp;
   }




   /* Multi-Stage Decoding: */

   /* first decoding: */
   PL1 = PL1_real;
   PL2 = PL2_real;
   L1  = L1_real;
   L2  = L2_real;
   rp  = rp_real;
   first_metric = metric_real;
   first_received = received_real;
   hardpoints_ptr = hardpoints;



   for (n = 0; n <= HMmix; n++)
   {

      for (level = 0; level < no_of_levels; level++)
      {

         metric = first_metric;
         received = first_received;

         for (m = 0; m < two_m_HMmix; m++)
         {   /* for real and imaginary part */


            for (sample_index = m; sample_index < (two_m_HMmix) * N; sample_index += two_m_HMmix)
            {

               sample = (float)received[sample_index >> (one_m_HMmix)];  /* extract real or imaginary part respectively */
               closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index]]);
               for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
               {
                  dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]);
                  if (dist < closest_zero)
                  {
                     closest_zero = dist;
                  }
               }
               closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] + (0x1 << level)]);
               for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
               {
                  dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]);
                  if (dist < closest_one)
                  {
                     closest_one = dist;
                  }
               }


//#ifdef CONSIDERING_SNR
               SNR = (float)signal_to_noise_ratio[sample_index >> (one_m_HMmix)];
               llr[sample_index] = (closest_zero - closest_one) * SNR;
               /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */
               /*#else
                    llr[sample_index] = (closest_zero - closest_one);
                    /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */
//#endif

            }
            metric = metric_imag;
            received = received_imag;


         }

         error = viterbi_decode (llr, (two_m_HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (two_m_HMmix) * N1, puncturing[(int)PL1[level]],
                                 puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                 infoout[level] + n * ((int)L1_real[level] + (int)L2_real[level] + 6),
                                 hardpoints_ptr, level, Deinterleaver + (two_m_HMmix) * N * level,
                                 (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);


      }


      PL1 = PL1_imag;
      PL2 = PL2_imag;
      L1  = L1_imag;
      L2  = L2_imag;
      rp  = rp_imag;
      first_metric = metric_imag;
      first_received = received_imag;
      hardpoints_ptr = hardpoints + N;

   }




   diff = 1;
   iteration = 0;
   /* iterations: */
   while (iteration < maxiter)
   {
      PL1 = PL1_real;
      PL2 = PL2_real;
      L1  = L1_real;
      L2  = L2_real;
      rp  = rp_real;
      first_metric = metric_real;
      first_received = received_real;
      hardpoints_ptr = hardpoints;

//#ifdef ITER_BREAK
      memcpy(lastiter, hardpoints, 2 * N);
//#endif

      for (n = 0; n <= HMmix; n++)
      {

         for (level = 0; level < no_of_levels; level++)
         {

            metric = first_metric;
            received = first_received;

            for (m = 0; m < two_m_HMmix; m++)
            {   /* for real and imaginary part */


               for (sample_index = m; sample_index < (two_m_HMmix) * N; sample_index += two_m_HMmix)
               {

                  sample = (float)received[sample_index >> (one_m_HMmix)];  /* extract real or imaginary part respectively */
                  closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index] & ~(0x1 << level)]);
                  closest_one  = fabs(sample - metric[hardpoints_ptr[sample_index] |  (0x1 << level)]);

//#ifdef CONSIDERING_SNR
                  SNR = (float)signal_to_noise_ratio[sample_index >> (one_m_HMmix)];
                  llr[sample_index] = (closest_zero - closest_one) * SNR;
                  /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */
                  /*#else
                        llr[sample_index] = (closest_zero - closest_one);
                        /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */
//#endif


               }
               metric = metric_imag;
               received = received_imag;

            }

            error = viterbi_decode (llr, (two_m_HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (two_m_HMmix) * N1, puncturing[(int)PL1[level]],
                                    puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                    infoout[level] + n * ((int)L1_real[level] + (int)L2_real[level] + 6),
                                    hardpoints_ptr, level, Deinterleaver + (two_m_HMmix) * N * level,
                                    (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);


//#ifdef ITER_BREAK
            if (level == 0)
            {
               diff = 0;
               for (sample_index = 0; sample_index < (two_m_HMmix) * N * sizeof(char) / sizeof(int); sample_index++)
               {
                  diff += (((int *)hardpoints)[sample_index] ^ ((int *)lastiter)[sample_index]) != 0;
               }

               /*diff = memcmp (lastiter,hardpoints,2 * N); */
               if (!diff)
               {
                  break;
               }
            }
//#endif
         } /* for (level = 0; level < no_of_levels; level++) */


         PL1 = PL1_imag;
         PL2 = PL2_imag;
         L1  = L1_imag;
         L2  = L2_imag;
         rp  = rp_imag;
         first_metric = metric_imag;
         first_received = received_imag;
         hardpoints_ptr = hardpoints + N;

      } /* for (n = 0; n <= HMmix; n++) */



//#ifdef ITER_BREAK
      if (!diff)
      {
         break;
      }
//#endif
      iteration++;
   } /* while (iteration < maxiter) */






   /*WRITE OUT RESULT - NOT IN DIORAMA*/
   for (m = 0;m < 4674;m++)
   {
      result[m] = (int)hardpoints[m];
   }


//////////////////////////////////////////////////
//////////////////////////////////////////////////
   /*
       //Energy Dispersal
    
    no_of_bits = 0;
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     no_of_bits += (int)L1_real[level] + (int)L2_real[level];
    }
    for (level = 0; level < no_of_levels; level++) {
     no_of_bits += (int)L1_imag[level] + (int)L2_imag[level];
    }
    
    
    plhs[0] = mxCreateDoubleMatrix(1,no_of_bits, mxREAL);
    output_ptr = mxGetPr(plhs[0]);
    
    
    PRBS_INIT(PRBS_reg);
    n = 0;
    if (HMmix) {
     for (m = Lvspp + 6; m < Lvspp + 6 + (int)L1_imag[0]; m++) {
      output_ptr[n++] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     for (m = 0; m < (int)L1_real[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
     for (m = (int)L1_real[level] + (int)L2_real[level] + 6; m < (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    if (HMmix) {
     for (m = Lvspp + 6 + (int)L1_imag[0]; m < Lvspp + 6 + (int)L1_imag[0] + (int)L2_imag[0]; m++) {
      output_ptr[n++] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     for (m = (int)L1_real[level]; m < (int)L1_real[level] + (int)L2_real[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
     for (m = (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level]; m < (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level] + (int)L2_imag[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    
    PRBS_INIT(PRBS_reg);
    if ((Lvspp != 0) && (nlhs < 2)) {
     mexWarnMsgTxt(PROGNAME ": There is a very strongly protected part, but no variable to put it into!");
    }
    
    if (nlhs > 1) {
     no_of_bits = Lvspp;
     plhs[1] = mxCreateDoubleMatrix(1,no_of_bits, mxREAL);
     output_ptr = mxGetPr(plhs[1]);
     for (m = 0; m < Lvspp; m++) {
      output_ptr[m] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    if (nlhs > 2) {
     plhs[2] = mxCreateDoubleMatrix(1,1, mxREAL);
     output_ptr = mxGetPr(plhs[2]);
     output_ptr[0] = (double)iteration;
    }
    
    if (nlhs > 3) {  //variance calculation
     plhs[3] = mxCreateDoubleMatrix(1,1, mxREAL);
     output_ptr = mxGetPr(plhs[3]);
     variance = 0.0;
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_real[sample_index];  // extract real part respectively
      dist = (sample - metric_real[hardpoints[(2 - HMmix) * sample_index]]);
      variance += (double)dist * (double)dist;
      sample = (float)received_imag[sample_index];  // extract imaginary part respectively
      dist = (sample - metric_imag[hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]);
      variance += (double)dist * (double)dist;
     }
    
     output_ptr[0] = variance/((double)N);
    }
    
    if (nlhs > 4) {  //output error signal
     plhs[4] = mxCreateDoubleMatrix(1,N, mxCOMPLEX);
    
     output_ptr = mxGetPr(plhs[4]);
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_real[sample_index];  // extract real part
      output_ptr[sample_index] = (sample - metric_real[hardpoints[(2 - HMmix) * sample_index]]);
     }
     output_ptr = mxGetPi(plhs[4]);
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_imag[sample_index];  // extract imaginary part
      output_ptr[sample_index] = (sample - metric_imag[hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]);
     }
    }
   */
//////////////////////////////////////////////////
//////////////////////////////////////////////////


   free(memory_ptr);

   return;
}

//////////////////////////////////////////////
//ORIGINAL NEW MSD HARD FUNCTION///
///////////////////////////////////////////

/* HMmix not yet supported */


#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>


#define NARGS_RHS_STR "9"
#define NARGS_RHS 9
#define PROGNAME "msd_hard"
#define PRBS_INIT(reg) reg = 511;
#define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1)
#define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1)


void msd_hard_new_original (int *result)
{


   float *received_real, *received_imag, *received, *first_received, *L1, *L2, *L1_real, *L2_real, *L1_imag, *L2_imag;
   float *PL1, *PL2, *PL1_real, *PL2_real, *PL1_imag, *PL2_imag, L_dummy[3] = {0, 0, 0};
   int *Deinterleaver;
   float *metric_real, *metric_imag, *metric, *first_metric, closest_one, closest_zero, sample, *llr, dist;
   //float variance, weightsum;
   char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *hardpoints_ptr, *lastiter, *infoout[3];
   int m, n, iteration, diff;
   int sample_index, rp_real[3], rp_imag[3], *rp, level, subset_point, no_of_bits, error, msd_mem_size, viterbi_mem_size;
   //int PRBS_reg;
   int HMmix = 0, HMsym = 0;
//#ifdef CONSIDERING_SNR
   float *signal_to_noise_ratio;
   float SNR;
//#endif

   received_real = &received1[0];
   received_imag = &received1[2337];
//L1 = &L[0][0];
//L2 = L1 + no_of_levels;
//PL1 = &PL[0][0];
//PL2 = PL1 + no_of_levels;
   signal_to_noise_ratio = &signal_to_noise_ratio1[0];
   Deinterleaver = &Deinterleaver1[0];



//new
   L1_real = &L[0][0];
   L2_real = L1_real + no_of_levels;
   if (HMmix)
   {
      L1_imag = L2_real + no_of_levels;
      L2_imag = L1_imag + no_of_levels;
   }
   else
   {
      L1_imag = L_dummy;
      L2_imag = L_dummy;
   }

   PL1_real = &PL[0][0];
   PL2_real = PL1_real + no_of_levels;
   PL1_imag = PL2_real + no_of_levels;
   PL2_imag = PL1_imag + no_of_levels;







   /* memory allocation and initialization: */
   no_of_bits = 0;
   for (level = 0; level < no_of_levels; level++)
   {
      no_of_bits += (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level] + (int)L2_imag[level] + 6;
   }

   msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char);
   viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char);

   if (received_imag == NULL)
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size + N * sizeof(double));

      received_imag = (double *) (memory_ptr + viterbi_mem_size + msd_mem_size);
      memset (received_imag, 0, N * sizeof(double));
   }
   else
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size);
   }




   viterbi_mem = memory_ptr;
   msd_mem = memory_ptr + viterbi_mem_size;

   llr = (float *) msd_mem;
   hardpoints = (char *) (msd_mem + 2 * N * sizeof(float));
   lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char));
   infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char));
   infoout[1] = 0;
   for (m = 1; m < no_of_levels; m++)
   {
      infoout[m] = infoout[m-1] + (int)L1_real[m-1] + (int)L2_real[m-1] + 6 + (int)L1_imag[m-1] + (int)L2_imag[m-1] + 6;
   }
   memset(hardpoints, 0, 2 * N * sizeof(char));




   /* choosing partitioning type: */
   if (no_of_levels == 3)
   {
      if ((Lvspp != 0) && HMmix)
      {   /* HMmix 64-QAM */
         metric_real = partitioning[1];
         metric_imag = partitioning[0];
         rp_real[0] =        (N - 12) - RY[(int)PL2_real[0]] *        ((N - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = ((N - N1) - 12) - RY[(int)PL2_real[1]] * (((N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = ((N - N1) - 12) - RY[(int)PL2_real[2]] * (((N - N1) - 12) / RY[(int)PL2_real[2]]);
         rp_imag[0] = ((N - N1) - 12) - RY[(int)PL2_imag[0]] * (((N - N1) - 12) / RY[(int)PL2_imag[0]]);
         rp_imag[1] = ((N - N1) - 12) - RY[(int)PL2_imag[1]] * (((N - N1) - 12) / RY[(int)PL2_imag[1]]);
         rp_imag[2] = ((N - N1) - 12) - RY[(int)PL2_imag[2]] * (((N - N1) - 12) / RY[(int)PL2_imag[2]]);

      }
      else if (Lvspp != 0)
      {    /* HMsym 64-QAM */
         HMsym = 1;
         metric_real = partitioning[1];
         metric_imag = partitioning[1];
         rp_real[0] =        (2 * N - 12) - RY[(int)PL2_real[0]] *        ((2 * N - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = (2 * (N - N1) - 12) - RY[(int)PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[2]]);
      }
      else
      {        /* SM 64-QAM */
         metric_real = partitioning[0];
         metric_imag = partitioning[0];
         rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
         rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
         rp_real[2] = (2 * (N - N1) - 12) - RY[(int)PL2_real[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[2]]);
      }

   }
   else if (no_of_levels == 2)
   {    /* SM 16-QAM */
      rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
      rp_real[1] = (2 * (N - N1) - 12) - RY[(int)PL2_real[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[1]]);
      metric_real = partitioning[2];
      metric_imag = partitioning[2];
   }
   else
   {         /* SM 4-QAM */
      rp_real[0] = (2 * (N - N1) - 12) - RY[(int)PL2_real[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2_real[0]]);
      metric_real = partitioning[3];
      metric_imag = partitioning[3];
   }
   if (!SDCorMSC)
   {
      rp_real[0] = -12;
      rp_real[1] = -12;
      rp_real[2] = -12;
   }
   if (Lvspp != 0)
   {
      L1_real[0] = 0;
      L2_real[0] = (double) Lvspp;
   }




   /* Multi-Stage Decoding: */

   /* first decoding: */
   PL1 = PL1_real;
   PL2 = PL2_real;
   L1  = L1_real;
   L2  = L2_real;
   rp  = rp_real;
   first_metric = metric_real;
   first_received = received_real;
   hardpoints_ptr = hardpoints;

   for (n = 0; n <= HMmix; n++)
   {

      for (level = 0; level < no_of_levels; level++)
      {

         metric = first_metric;
         received = first_received;

         for (m = 0; m < 2 - HMmix; m++)
         {   /* for real and imaginary part */


            for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix)
            {

               sample = (float)received[sample_index >> (1 - HMmix)];  /* extract real or imaginary part respectively */
               closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index]]);
               for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
               {
                  dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]);
                  if (dist < closest_zero)
                  {
                     closest_zero = dist;
                  }
               }
               closest_one = fabs(sample - metric[hardpoints_ptr[sample_index] + (0x1 << level)]);
               for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
               {
                  dist = fabs(sample - metric[hardpoints_ptr[sample_index] + subset_point]);
                  if (dist < closest_one)
                  {
                     closest_one = dist;
                  }
               }


//#ifdef CONSIDERING_SNR
               SNR = (float)signal_to_noise_ratio[sample_index >> (1 - HMmix)];
               llr[sample_index] = (closest_zero - closest_one) * SNR;
               /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */
               /*#else
                    llr[sample_index] = (closest_zero - closest_one);
                    /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */
//#endif

            }
            metric = metric_imag;
            received = received_imag;


         }

         error = viterbi_decode (llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int)PL1[level]],
                                 puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                 infoout[level] + n * ((int)L1_real[level] + (int)L2_real[level] + 6),
                                 hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level,
                                 (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);


      }


      PL1 = PL1_imag;
      PL2 = PL2_imag;
      L1  = L1_imag;
      L2  = L2_imag;
      rp  = rp_imag;
      first_metric = metric_imag;
      first_received = received_imag;
      hardpoints_ptr = hardpoints + N;

   }




   diff = 1;
   iteration = 0;
   /* iterations: */
   while (iteration < maxiter)
   {
      PL1 = PL1_real;
      PL2 = PL2_real;
      L1  = L1_real;
      L2  = L2_real;
      rp  = rp_real;
      first_metric = metric_real;
      first_received = received_real;
      hardpoints_ptr = hardpoints;

//#ifdef ITER_BREAK
      memcpy(lastiter, hardpoints, 2 * N);
//#endif

      for (n = 0; n <= HMmix; n++)
      {

         for (level = 0; level < no_of_levels; level++)
         {

            metric = first_metric;
            received = first_received;

            for (m = 0; m < 2 - HMmix; m++)
            {   /* for real and imaginary part */


               for (sample_index = m; sample_index < (2 - HMmix) * N; sample_index += 2 - HMmix)
               {

                  sample = (float)received[sample_index >> (1 - HMmix)];  /* extract real or imaginary part respectively */
                  closest_zero = fabs(sample - metric[hardpoints_ptr[sample_index] & ~(0x1 << level)]);
                  closest_one  = fabs(sample - metric[hardpoints_ptr[sample_index] |  (0x1 << level)]);

//#ifdef CONSIDERING_SNR
                  SNR = (float)signal_to_noise_ratio[sample_index >> (1 - HMmix)];
                  llr[sample_index] = (closest_zero - closest_one) * SNR;
                  /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one) * SNR * SNR; */
                  /*#else
                        llr[sample_index] = (closest_zero - closest_one);
                        /* llr[sample_index] = (closest_zero*closest_zero - closest_one*closest_one); */
//#endif


               }
               metric = metric_imag;
               received = received_imag;

            }

            error = viterbi_decode (llr, (2 - HMmix) * N, (level || (!HMsym && (n || !HMmix))) * (2 - HMmix) * N1, puncturing[(int)PL1[level]],
                                    puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                    infoout[level] + n * ((int)L1_real[level] + (int)L2_real[level] + 6),
                                    hardpoints_ptr, level, Deinterleaver + (2 - HMmix) * N * level,
                                    (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);


//#ifdef ITER_BREAK
            if (level == 0)
            {
               diff = 0;
               for (sample_index = 0; sample_index < (2 - HMmix) * N * sizeof(char) / sizeof(int); sample_index++)
               {
                  diff += (((int *)hardpoints)[sample_index] ^ ((int *)lastiter)[sample_index]) != 0;
               }

               /*diff = memcmp (lastiter,hardpoints,2 * N); */
               if (!diff)
               {
                  break;
               }
            }
//#endif
         } /* for (level = 0; level < no_of_levels; level++) */


         PL1 = PL1_imag;
         PL2 = PL2_imag;
         L1  = L1_imag;
         L2  = L2_imag;
         rp  = rp_imag;
         first_metric = metric_imag;
         first_received = received_imag;
         hardpoints_ptr = hardpoints + N;

      } /* for (n = 0; n <= HMmix; n++) */



//#ifdef ITER_BREAK
      if (!diff)
      {
         break;
      }
//#endif
      iteration++;
   } /* while (iteration < maxiter) */






   /*WRITE OUT RESULT - NOT IN DIORAMA*/
   for (m = 0;m < 4674;m++)
   {
      result[m] = (int)hardpoints[m];
   }


//////////////////////////////////////////////////
//////////////////////////////////////////////////
   /*
       //Energy Dispersal
    
    no_of_bits = 0;
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     no_of_bits += (int)L1_real[level] + (int)L2_real[level];
    }
    for (level = 0; level < no_of_levels; level++) {
     no_of_bits += (int)L1_imag[level] + (int)L2_imag[level];
    }
    
    
    plhs[0] = mxCreateDoubleMatrix(1,no_of_bits, mxREAL);
    output_ptr = mxGetPr(plhs[0]);
    
    
    PRBS_INIT(PRBS_reg);
    n = 0;
    if (HMmix) {
     for (m = Lvspp + 6; m < Lvspp + 6 + (int)L1_imag[0]; m++) {
      output_ptr[n++] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     for (m = 0; m < (int)L1_real[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
     for (m = (int)L1_real[level] + (int)L2_real[level] + 6; m < (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    if (HMmix) {
     for (m = Lvspp + 6 + (int)L1_imag[0]; m < Lvspp + 6 + (int)L1_imag[0] + (int)L2_imag[0]; m++) {
      output_ptr[n++] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    for (level = (Lvspp != 0); level < no_of_levels; level++) {
     for (m = (int)L1_real[level]; m < (int)L1_real[level] + (int)L2_real[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
     for (m = (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level]; m < (int)L1_real[level] + (int)L2_real[level] + 6 + (int)L1_imag[level] + (int)L2_imag[level]; m++) {
      output_ptr[n++] = (double)(infoout[level][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    
    PRBS_INIT(PRBS_reg);
    if ((Lvspp != 0) && (nlhs < 2)) {
     mexWarnMsgTxt(PROGNAME ": There is a very strongly protected part, but no variable to put it into!");
    }
    
    if (nlhs > 1) {
     no_of_bits = Lvspp;
     plhs[1] = mxCreateDoubleMatrix(1,no_of_bits, mxREAL);
     output_ptr = mxGetPr(plhs[1]);
     for (m = 0; m < Lvspp; m++) {
      output_ptr[m] = (double)(infoout[0][m] ^ PRBS_BIT(PRBS_reg));
      PRBS_SHIFT(PRBS_reg);
     }
    }
    
    if (nlhs > 2) {
     plhs[2] = mxCreateDoubleMatrix(1,1, mxREAL);
     output_ptr = mxGetPr(plhs[2]);
     output_ptr[0] = (double)iteration;
    }
    
    if (nlhs > 3) {  //variance calculation
     plhs[3] = mxCreateDoubleMatrix(1,1, mxREAL);
     output_ptr = mxGetPr(plhs[3]);
     variance = 0.0;
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_real[sample_index];  // extract real part respectively
      dist = (sample - metric_real[hardpoints[(2 - HMmix) * sample_index]]);
      variance += (double)dist * (double)dist;
      sample = (float)received_imag[sample_index];  // extract imaginary part respectively
      dist = (sample - metric_imag[hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]);
      variance += (double)dist * (double)dist;
     }
    
     output_ptr[0] = variance/((double)N);
    }
    
    if (nlhs > 4) {  //output error signal
     plhs[4] = mxCreateDoubleMatrix(1,N, mxCOMPLEX);
    
     output_ptr = mxGetPr(plhs[4]);
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_real[sample_index];  // extract real part
      output_ptr[sample_index] = (sample - metric_real[hardpoints[(2 - HMmix) * sample_index]]);
     }
     output_ptr = mxGetPi(plhs[4]);
     for (sample_index = 0; sample_index < N; sample_index++) {
      sample = (float)received_imag[sample_index];  // extract imaginary part
      output_ptr[sample_index] = (sample - metric_imag[hardpoints[HMmix * (N - 1) + (2 - HMmix) * sample_index + 1]]);
     }
    }
   */
//////////////////////////////////////////////////
//////////////////////////////////////////////////


   free(memory_ptr);

   return;
}

//////////////////////////////////////////////
//MODIFIED OLD MSD HARD FUNCTION///
///////////////////////////////////////////

/* HMmix not yet supported */

#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>

// ------------------------------------------------------
//
// Select what kind of code unrolling is going to be used
// during optimization of euclidean distances computation
#define CODE_UNROLLING_TYPE 3
//
// ------------------------------------------------------


#define NARGS_RHS_STR "9"
#define NARGS_RHS 9
#define PROGNAME "msd_hard"
#define PRBS_INIT(reg) reg = 511;
#define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1)
#define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1)


void msd_hard_old_modified (int *result)
{

   int sample_index, level, error, start1, start2, stop, inc, ninc;
   float *received_real, *received_imag, *L1, *L2, *PL1, *PL2;
   int *Deinterleaver;
   float *metric_real, *metric_imag, closest_one, closest_zero, sample, *llr;
   char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *lastiter, *infoout[3];
   int m, iteration, diff;
   int rp[3], no_of_bits, msd_mem_size, viterbi_mem_size;
   float *signal_to_noise_ratio;
   float SNR;
   float dist_r_0, dist_i_0, dist_r_1, dist_i_1, sample_r, sample_i, closest_one_r, closest_one_i, closest_zero_r, closest_zero_i;
   int index1, index2;
   float *ptr1, *ptr2, *ptr3, *ptr4;

   received_real = &received1[0];
   received_imag = &received1[2337];
   L1 = &L[0][0];
   L2 = L1 + no_of_levels;
   PL1 = &PL[0][0];
   PL2 = PL1 + no_of_levels;
   signal_to_noise_ratio = &signal_to_noise_ratio1[0];
   Deinterleaver = &Deinterleaver1[0];


   /* memory allocation and initialization: */
   no_of_bits = 0;
   for (level = 0; level < no_of_levels; level++)
   {
      no_of_bits += (int)L1[level] + (int)L2[level] + 6;
   }

   msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char);
   viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char);


   if (received_imag == NULL)
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size + N * sizeof(double));

      received_imag = (double *) (memory_ptr + viterbi_mem_size + msd_mem_size);
      memset (received_imag, 0, N * sizeof(double));
   }
   else
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size);
   }



   viterbi_mem = memory_ptr;
   msd_mem = memory_ptr + viterbi_mem_size;

   llr = (float *) msd_mem;
   hardpoints = (char *) (msd_mem + 2 * N * sizeof(float));
   lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char));
   infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char));
   infoout[1] = 0;

   for (m = 1; m < no_of_levels; m++)
   {
      infoout[m] = infoout[m-1] + (int)L1[m-1] + (int)L2[m-1] + 6;

   }
   memset(hardpoints, 0, 2 * N * sizeof(char));

   /* choosing partitioning type: */
   if (no_of_levels == 3)
   {
      if (Lvspp != 0)
      {      /* HMsym 64-QAM */
         rp[0] = (2 * N - 12) - RY[(int)PL2[0]] * ((2 * N - 12) / RY[(int)PL2[0]]);
         metric_real = partitioning[1];
         metric_imag = partitioning[1];

      }
      else
      {        /* SM 64-QAM */
         rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
         metric_real = partitioning[0];
         metric_imag = partitioning[0];

      }
      rp[1] = (2 * (N - N1) - 12) - RY[(int)PL2[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2[1]]);
      rp[2] = (2 * (N - N1) - 12) - RY[(int)PL2[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2[2]]);

   }
   else if (no_of_levels == 2)
   {    /* SM 16-QAM */
      rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
      rp[1] = (2 * (N - N1) - 12) - RY[(int)PL2[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2[1]]);
      metric_real = partitioning[2];
      metric_imag = partitioning[2];

   }
   else
   {         /* SM 4-QAM */
      rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
      metric_real = partitioning[3];
      metric_imag = partitioning[3];

   }
   if (!SDCorMSC)
   {
      rp[0] = -12;
      rp[1] = -12;
      rp[2] = -12;
   }
   if (Lvspp != 0)
   {
      L1[0] = 0;
      L2[0] = (double) Lvspp;
   }




   /* Multi-Stage Decoding: */
   /* first decoding: */


#if (CODE_UNROLLING_TYPE == 1)
//--------------------------------------------------------------------
// 1111111111111111111111111111111111111111111111111111111111111111111
//--------------------------------------------------------------------
//
//  IMPLELENTATION WITH VARIABLE CYCLE LENGHT OF THE
//      DECODING FUNCTION
//
//--------------------------------------------------------------------
// 1111111111111111111111111111111111111111111111111111111111111111111
//--------------------------------------------------------------------

   for (level = 0; level < no_of_levels; level++)
   {

      start1 = (0x1 << (level + 1));
      start2 = (0x3 << level);
      stop = (0x1 << no_of_levels);
      inc = (0x1 << level);

      for (sample_index = 0; sample_index < N; sample_index++)
      {

         sample_r = (float)received_real[sample_index];
         sample_i = (float)received_imag[sample_index];

         index1 = hardpoints[2 * sample_index];
         index2 = hardpoints[2 * sample_index + 1];

         ptr1 = &metric_real[index1];
         ptr2 = &metric_imag[index2];
         ptr3 = &metric_real[index1+start2];
         ptr4 = &metric_imag[index2+start2];

         closest_zero_r = (float)fabs(sample_r - *ptr1);
         closest_zero_i = (float)fabs(sample_i - *ptr2);
         ptr1 += start1;
         ptr2 += start1;

         closest_one_r = (float)fabs(sample_r - metric_real[index1 + inc]);
         closest_one_i = (float)fabs(sample_i - metric_imag[index2 + inc]);

         for (subset_point = start1; subset_point < stop; subset_point += start1)
         {
            dist_r_0 = (float)fabs(sample_r - *ptr1);
            dist_i_0 = (float)fabs(sample_i - *ptr2);
            dist_r_1 = (float)fabs(sample_r - *ptr3);
            dist_i_1 = (float)fabs(sample_i - *ptr4);

            if (dist_r_0 < closest_zero_r)
            {
               closest_zero_r = dist_r_0;
            }
            if (dist_i_0 < closest_zero_i)
            {
               closest_zero_i = dist_i_0;
            }
            if (dist_r_1 < closest_one_r)
            {
               closest_one_r = dist_r_1;
            }
            if (dist_i_1 < closest_one_i)
            {
               closest_one_i = dist_i_1;
            }
            ptr1 += start1;
            ptr2 += start1;
            ptr3 += start1;
            ptr4 += start1;
         }

         SNR = (float)signal_to_noise_ratio[sample_index];

         llr[2 * sample_index] = (closest_zero_r - closest_one_r) * SNR;
         llr[2 * sample_index + 1] = (closest_zero_i - closest_one_i) * SNR;
      }

      error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                              puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                              infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                              (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   }
//--------------------------------------------------------------------
// 1111111111111111111111111111111111111111111111111111111111111111111
//--------------------------------------------------------------------
//
//  END OF IMPLELENTATION WITH VARIABLE CYCLE LENGHT OF THE
//      DECODING FUNCTION
//
//--------------------------------------------------------------------
// 1111111111111111111111111111111111111111111111111111111111111111111
//--------------------------------------------------------------------
#endif



#if (CODE_UNROLLING_TYPE == 2)
//--------------------------------------------------------------------
// 2222222222222222222222222222222222222222222222222222222222222222222
//--------------------------------------------------------------------
//
//  IMPLELENTATION ONLY WITH UNROLL OF INTERNAL "for" LOOP
//  WITH INSERTION OF SOME CONDITIONAL EXPRESSION ("if")
//
//--------------------------------------------------------------------
// 2222222222222222222222222222222222222222222222222222222222222222222
//--------------------------------------------------------------------

   for (level = 0; level < no_of_levels; level++)
   {

      start1 = (0x1 << (level + 1));
      start2 = (0x3 << level);
      stop = (0x1 << no_of_levels);
      inc = (0x1 << level);

      for (sample_index = 0; sample_index < N; sample_index++)
      {

         sample_r = (float)received_real[sample_index];
         sample_i = (float)received_imag[sample_index];

         index1 = hardpoints[2 * sample_index];
         index2 = hardpoints[2 * sample_index + 1];

         ptr1 = &metric_real[index1];
         ptr2 = &metric_imag[index2];
         ptr3 = &metric_real[index1+start2];
         ptr4 = &metric_imag[index2+start2];

         closest_zero_r = (float)fabs(sample_r - *ptr1);
         closest_zero_i = (float)fabs(sample_i - *ptr2);
         ptr1 += start1;
         ptr2 += start1;

         closest_one_r = (float)fabs(sample_r - metric_real[index1 + inc]);
         closest_one_i = (float)fabs(sample_i - metric_imag[index2 + inc]);

         if(level < 2)
         {
            dist_r_0 = (float)fabs(sample_r - *ptr1);
            dist_i_0 = (float)fabs(sample_i - *ptr2);
            dist_r_1 = (float)fabs(sample_r - *ptr3);
            dist_i_1 = (float)fabs(sample_i - *ptr4);

            if (dist_r_0 < closest_zero_r)
            {
               closest_zero_r = dist_r_0;
            }
            if (dist_i_0 < closest_zero_i)
            {
               closest_zero_i = dist_i_0;
            }
            if (dist_r_1 < closest_one_r)
            {
               closest_one_r = dist_r_1;
            }
            if (dist_i_1 < closest_one_i)
            {
               closest_one_i = dist_i_1;
            }
            ptr1 += start1;
            ptr2 += start1;
            ptr3 += start1;
            ptr4 += start1;
         }

         if(level < 1)
         {
            dist_r_0 = (float)fabs(sample_r - *ptr1);
            dist_i_0 = (float)fabs(sample_i - *ptr2);
            dist_r_1 = (float)fabs(sample_r - *ptr3);
            dist_i_1 = (float)fabs(sample_i - *ptr4);

            if (dist_r_0 < closest_zero_r)
            {
               closest_zero_r = dist_r_0;
            }
            if (dist_i_0 < closest_zero_i)
            {
               closest_zero_i = dist_i_0;
            }
            if (dist_r_1 < closest_one_r)
            {
               closest_one_r = dist_r_1;
            }
            if (dist_i_1 < closest_one_i)
            {
               closest_one_i = dist_i_1;
            }
            ptr1 += start1;
            ptr2 += start1;
            ptr3 += start1;
            ptr4 += start1;

            dist_r_0 = (float)fabs(sample_r - *ptr1);
            dist_i_0 = (float)fabs(sample_i - *ptr2);
            dist_r_1 = (float)fabs(sample_r - *ptr3);
            dist_i_1 = (float)fabs(sample_i - *ptr4);

            if (dist_r_0 < closest_zero_r)
            {
               closest_zero_r = dist_r_0;
            }
            if (dist_i_0 < closest_zero_i)
            {
               closest_zero_i = dist_i_0;
            }
            if (dist_r_1 < closest_one_r)
            {
               closest_one_r = dist_r_1;
            }
            if (dist_i_1 < closest_one_i)
            {
               closest_one_i = dist_i_1;
            }
         }

         SNR = (float)signal_to_noise_ratio[sample_index];

         llr[2 * sample_index] = (closest_zero_r - closest_one_r) * SNR;
         llr[2 * sample_index + 1] = (closest_zero_i - closest_one_i) * SNR;
      }

      error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                              puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                              infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                              (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   }
//--------------------------------------------------------------------
// 2222222222222222222222222222222222222222222222222222222222222222222
//--------------------------------------------------------------------
//
//  END OF IMPLELENTATION ONLY WITH UNROLL OF INTERNAL "for" LOOP
//  WITH INSERTION OF SOME CONDITIONAL EXPRESSION ("if")
//
//--------------------------------------------------------------------
// 2222222222222222222222222222222222222222222222222222222222222222222
//--------------------------------------------------------------------
#endif



#if (CODE_UNROLLING_TYPE == 3)
//--------------------------------------------------------------------
// 3333333333333333333333333333333333333333333333333333333333333333333
//--------------------------------------------------------------------
//
//   TOTALLY "for" CYCLES UNROLL IMPLEMENTATION
//     ON LEVELS AND ON SYMBOLS
//   (about 3 times bigger code --> how mutch faster??)
//
//--------------------------------------------------------------------
// 3333333333333333333333333333333333333333333333333333333333333333333
//--------------------------------------------------------------------

   level = 0;

   start1 = (0x1 << (level + 1));
   start2 = (0x3 << level);
   stop = (0x1 << no_of_levels);
   inc = (0x1 << level);

   for (sample_index = 0; sample_index < N; sample_index++)
   {

      sample_r = (float)received_real[sample_index];
      sample_i = (float)received_imag[sample_index];

      index1 = hardpoints[2 * sample_index];
      index2 = hardpoints[2 * sample_index + 1];

      ptr1 = &metric_real[index1];
      ptr2 = &metric_imag[index2];
      ptr3 = &metric_real[index1+start2];
      ptr4 = &metric_imag[index2+start2];

      closest_zero_r = (float)fabs(sample_r - *ptr1);
      closest_zero_i = (float)fabs(sample_i - *ptr2);
      ptr1 += start1;
      ptr2 += start1;

      closest_one_r = (float)fabs(sample_r - metric_real[index1 + inc]);
      closest_one_i = (float)fabs(sample_i - metric_imag[index2 + inc]);

      dist_r_0 = (float)fabs(sample_r - *ptr1);
      dist_i_0 = (float)fabs(sample_i - *ptr2);
      dist_r_1 = (float)fabs(sample_r - *ptr3);
      dist_i_1 = (float)fabs(sample_i - *ptr4);

      if (dist_r_0 < closest_zero_r)
      {
         closest_zero_r = dist_r_0;
      }
      if (dist_i_0 < closest_zero_i)
      {
         closest_zero_i = dist_i_0;
      }
      if (dist_r_1 < closest_one_r)
      {
         closest_one_r = dist_r_1;
      }
      if (dist_i_1 < closest_one_i)
      {
         closest_one_i = dist_i_1;
      }
      ptr1 += start1;
      ptr2 += start1;
      ptr3 += start1;
      ptr4 += start1;

      dist_r_0 = (float)fabs(sample_r - *ptr1);
      dist_i_0 = (float)fabs(sample_i - *ptr2);
      dist_r_1 = (float)fabs(sample_r - *ptr3);
      dist_i_1 = (float)fabs(sample_i - *ptr4);

      if (dist_r_0 < closest_zero_r)
      {
         closest_zero_r = dist_r_0;
      }
      if (dist_i_0 < closest_zero_i)
      {
         closest_zero_i = dist_i_0;
      }
      if (dist_r_1 < closest_one_r)
      {
         closest_one_r = dist_r_1;
      }
      if (dist_i_1 < closest_one_i)
      {
         closest_one_i = dist_i_1;
      }
      ptr1 += start1;
      ptr2 += start1;
      ptr3 += start1;
      ptr4 += start1;

      dist_r_0 = (float)fabs(sample_r - *ptr1);
      dist_i_0 = (float)fabs(sample_i - *ptr2);
      dist_r_1 = (float)fabs(sample_r - *ptr3);
      dist_i_1 = (float)fabs(sample_i - *ptr4);

      if (dist_r_0 < closest_zero_r)
      {
         closest_zero_r = dist_r_0;
      }
      if (dist_i_0 < closest_zero_i)
      {
         closest_zero_i = dist_i_0;
      }
      if (dist_r_1 < closest_one_r)
      {
         closest_one_r = dist_r_1;
      }
      if (dist_i_1 < closest_one_i)
      {
         closest_one_i = dist_i_1;
      }

      SNR = (float)signal_to_noise_ratio[sample_index];

      llr[2 * sample_index] = (closest_zero_r - closest_one_r) * SNR;
      llr[2 * sample_index + 1] = (closest_zero_i - closest_one_i) * SNR;
   }

   error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                           puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                           infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                           (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   level++;
   if(level < no_of_levels)
   {
      start1 = (0x1 << (level + 1));
      start2 = (0x3 << level);
      stop = (0x1 << no_of_levels);
      inc = (0x1 << level);

      for (sample_index = 0; sample_index < N; sample_index++)
      {

         sample_r = (float)received_real[sample_index];
         sample_i = (float)received_imag[sample_index];

         index1 = hardpoints[2 * sample_index];
         index2 = hardpoints[2 * sample_index + 1];

         ptr1 = &metric_real[index1];
         ptr2 = &metric_imag[index2];
         ptr3 = &metric_real[index1+start2];
         ptr4 = &metric_imag[index2+start2];

         closest_zero_r = (float)fabs(sample_r - *ptr1);
         closest_zero_i = (float)fabs(sample_i - *ptr2);
         ptr1 += start1;
         ptr2 += start1;

         closest_one_r = (float)fabs(sample_r - metric_real[index1 + inc]);
         closest_one_i = (float)fabs(sample_i - metric_imag[index2 + inc]);

         dist_r_0 = (float)fabs(sample_r - *ptr1);
         dist_i_0 = (float)fabs(sample_i - *ptr2);
         dist_r_1 = (float)fabs(sample_r - *ptr3);
         dist_i_1 = (float)fabs(sample_i - *ptr4);

         if (dist_r_0 < closest_zero_r)
         {
            closest_zero_r = dist_r_0;
         }
         if (dist_i_0 < closest_zero_i)
         {
            closest_zero_i = dist_i_0;
         }
         if (dist_r_1 < closest_one_r)
         {
            closest_one_r = dist_r_1;
         }
         if (dist_i_1 < closest_one_i)
         {
            closest_one_i = dist_i_1;
         }

         SNR = (float)signal_to_noise_ratio[sample_index];

         llr[2 * sample_index] = (closest_zero_r - closest_one_r) * SNR;
         llr[2 * sample_index + 1] = (closest_zero_i - closest_one_i) * SNR;
      }

      error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                              puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                              infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                              (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   }

   level++;
   if(level < no_of_levels)
   {
      start1 = (0x1 << (level + 1));
      start2 = (0x3 << level);
      stop = (0x1 << no_of_levels);
      inc = (0x1 << level);

      for (sample_index = 0; sample_index < N; sample_index++)
      {

         sample_r = (float)received_real[sample_index];
         sample_i = (float)received_imag[sample_index];

         index1 = hardpoints[2 * sample_index];
         index2 = hardpoints[2 * sample_index + 1];

         ptr1 = &metric_real[index1];
         ptr2 = &metric_imag[index2];
         ptr3 = &metric_real[index1+start2];
         ptr4 = &metric_imag[index2+start2];

         closest_zero_r = (float)fabs(sample_r - *ptr1);
         closest_zero_i = (float)fabs(sample_i - *ptr2);
         ptr1 += start1;
         ptr2 += start1;

         closest_one_r = (float)fabs(sample_r - metric_real[index1 + inc]);
         closest_one_i = (float)fabs(sample_i - metric_imag[index2 + inc]);

         SNR = (float)signal_to_noise_ratio[sample_index];

         llr[2 * sample_index] = (closest_zero_r - closest_one_r) * SNR;
         llr[2 * sample_index + 1] = (closest_zero_i - closest_one_i) * SNR;
      }

      error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                              puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                              infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                              (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   }
//--------------------------------------------------------------------
// 3333333333333333333333333333333333333333333333333333333333333333333
//--------------------------------------------------------------------
//
//   END OF TOTALLY "for" CYCLES UNROLL IMPLEMENTATION
//     ON LEVELS AND ON SYMBOLS
//
//--------------------------------------------------------------------
// 3333333333333333333333333333333333333333333333333333333333333333333
//--------------------------------------------------------------------
#endif



   diff = 1;
   iteration = 0;
   while (iteration < maxiter)
   {

      memcpy(lastiter, hardpoints, 2 * N);

      for (level = 0; level < no_of_levels; level++)
      {

         inc = (0x1 << level);
         ninc = ~inc;

         for (sample_index = 0; sample_index < N; sample_index++)
         {
            sample = (float)received_real[sample_index];  /* extract real part */
            closest_zero = (float)fabs(sample - metric_real[hardpoints[2 * sample_index] & ninc]);
            closest_one  = (float)fabs(sample - metric_real[hardpoints[2 * sample_index] | inc]);

            SNR = (float)signal_to_noise_ratio[sample_index];

            llr[2 * sample_index] = (closest_zero - closest_one) * SNR;

            sample = (float)received_imag[sample_index];  /* extract imaginary part */
            closest_zero = (float)fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] & ninc]);
            closest_one  = (float)fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] | inc]);

            llr[2 * sample_index + 1] = (closest_zero - closest_one) * SNR;

         }

         error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                                 puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                 infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                                 (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

         if (level == 0)
         {
            diff = 0;
            for (sample_index = 0; sample_index < ((int)(2 * N * sizeof(char) / sizeof(int))); sample_index++)
            {
               diff += (((int *)hardpoints)[sample_index] ^ ((int *)lastiter)[sample_index]) != 0;
            }
            if (!diff)
            {
               break;
            }
         }
      }

      if (!diff)
      {
         break;
      }
      iteration++;
   }


   for (m = 0;m < 4674;m++)
   {
      result[m] = (int)hardpoints[m];
   }

   free(memory_ptr);

   return;
}

/////////////////////////////////////////////
//ORIGINAL OLD MSD HARD FUNCTION///
///////////////////////////////////////////

/* HMmix not yet supported */

#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdio.h>


#define NARGS_RHS_STR "9"
#define NARGS_RHS 9
#define PROGNAME "msd_hard"
#define PRBS_INIT(reg) reg = 511;
#define PRBS_BIT(reg) ((reg ^ (reg >> 4)) & 0x1)
#define PRBS_SHIFT(reg) reg = (((reg ^ (reg >> 4)) & 0x1) << 8) | (reg >> 1)


void msd_hard_old_original (int *result)
{


   float *received_real, *received_imag, *L1, *L2, *PL1, *PL2;
   int *Deinterleaver;
   float *metric_real, *metric_imag, closest_one, closest_zero, sample, *llr, dist;
   char *memory_ptr, *viterbi_mem, *msd_mem, *hardpoints, *lastiter, *infoout[3];
   int m, iteration, diff;
   int sample_index, rp[3], level, subset_point, no_of_bits, error, msd_mem_size, viterbi_mem_size;
// #ifdef CONSIDERING_SNR //
   float *signal_to_noise_ratio;
   float SNR;

// #endif










   received_real = &received1[0];
   received_imag = &received1[2337];
   L1 = &L[0][0];
   L2 = L1 + no_of_levels;
   PL1 = &PL[0][0];
   PL2 = PL1 + no_of_levels;
   signal_to_noise_ratio = &signal_to_noise_ratio1[0];
   Deinterleaver = &Deinterleaver1[0];







   /* memory allocation and initialization: */
   no_of_bits = 0;
   for (level = 0; level < no_of_levels; level++)
   {
      no_of_bits += (int)L1[level] + (int)L2[level] + 6;


   }

   msd_mem_size = 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char) + no_of_bits * sizeof(char);
   viterbi_mem_size = STATES * sizeof(float) + STATES * sizeof(float) + 2 * N * STATES * sizeof(char);


   if (received_imag == NULL)
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size + N * sizeof(double));

      received_imag = (double *) (memory_ptr + viterbi_mem_size + msd_mem_size);
      memset (received_imag, 0, N * sizeof(double));
   }
   else
   {
      memory_ptr = (char *)malloc(viterbi_mem_size + msd_mem_size);
   }



   viterbi_mem = memory_ptr;
   msd_mem = memory_ptr + viterbi_mem_size;

   llr = (float *) msd_mem;
   hardpoints = (char *) (msd_mem + 2 * N * sizeof(float));
   lastiter = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char));
   infoout[0] = (char *) (msd_mem + 2 * N * sizeof(float) + 2 * N * sizeof(char) + 2 * N * sizeof(char));
   infoout[1] = 0;

   for (m = 1; m < no_of_levels; m++)
   {
      infoout[m] = infoout[m-1] + (int)L1[m-1] + (int)L2[m-1] + 6;

   }
   memset(hardpoints, 0, 2 * N * sizeof(char));

   /* choosing partitioning type: */
   if (no_of_levels == 3)
   {
      if (Lvspp != 0)
      {      /* HMsym 64-QAM */
         rp[0] = (2 * N - 12) - RY[(int)PL2[0]] * ((2 * N - 12) / RY[(int)PL2[0]]);
         metric_real = partitioning[1];
         metric_imag = partitioning[1];

      }
      else
      {        /* SM 64-QAM */
         rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
         metric_real = partitioning[0];
         metric_imag = partitioning[0];

      }
      rp[1] = (2 * (N - N1) - 12) - RY[(int)PL2[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2[1]]);
      rp[2] = (2 * (N - N1) - 12) - RY[(int)PL2[2]] * ((2 * (N - N1) - 12) / RY[(int)PL2[2]]);

   }
   else if (no_of_levels == 2)
   {    /* SM 16-QAM */
      rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
      rp[1] = (2 * (N - N1) - 12) - RY[(int)PL2[1]] * ((2 * (N - N1) - 12) / RY[(int)PL2[1]]);
      metric_real = partitioning[2];
      metric_imag = partitioning[2];

   }
   else
   {         /* SM 4-QAM */
      rp[0] = (2 * (N - N1) - 12) - RY[(int)PL2[0]] * ((2 * (N - N1) - 12) / RY[(int)PL2[0]]);
      metric_real = partitioning[3];
      metric_imag = partitioning[3];

   }
   if (!SDCorMSC)
   {
      rp[0] = -12;
      rp[1] = -12;
      rp[2] = -12;
   }
   if (Lvspp != 0)
   {
      L1[0] = 0;
      L2[0] = (double) Lvspp;
   }




   /* first decoding: */
   for (level = 0; level < no_of_levels; level++)
   {

      for (sample_index = 0; sample_index < N; sample_index++)
      {
         sample = (float)received_real[sample_index];  /* extract real or imaginary part respectively */
         closest_zero = fabs(sample - metric_real[hardpoints[2 * sample_index]]);
         for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
         {

            dist = fabs(sample - metric_real[hardpoints[2 * sample_index] + subset_point]);

            if (dist < closest_zero)
            {
               closest_zero = dist;
            }
         }

         closest_one = fabs(sample - metric_real[hardpoints[2 * sample_index] + (0x1 << level)]);

         for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
         {
            dist = fabs(sample - metric_real[hardpoints[2 * sample_index] + subset_point]);
            if (dist < closest_one)
            {
               closest_one = dist;
            }
         }

// #ifdef CONSIDERING_SNR

         SNR = (float)signal_to_noise_ratio[sample_index];


         llr[2 * sample_index] = (closest_zero - closest_one) * SNR;

         sample = (float)received_imag[sample_index];  /* extract real or imaginary part respectively */
         closest_zero = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1]]);
         for (subset_point = (0x1 << (level + 1)); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
         {

            dist = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] + subset_point]);

            if (dist < closest_zero)
            {
               closest_zero = dist;
            }
         }
         closest_one = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] + (0x1 << level)]);


         for (subset_point = (0x3 << level); subset_point < (0x1 << no_of_levels); subset_point += (0x1 << (level + 1)))
         {


            dist = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] + subset_point]);

            if (dist < closest_one)
            {
               closest_one = dist;
            }
         }

// #ifdef CONSIDERING_SNR

         llr[2 * sample_index + 1] = (closest_zero - closest_one) * SNR;

      }


      error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                              puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                              infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                              (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);

   }

   diff = 1;
   iteration = 0;
   /* iterations: */
   while (iteration < maxiter)
   {

// #ifdef ITER_BREAK
      memcpy(lastiter, hardpoints, 2 * N);
// #endif

      for (level = 0; level < no_of_levels; level++)
      {

         for (sample_index = 0; sample_index < N; sample_index++)
         {
            sample = (float)received_real[sample_index];  /* extract real part */
            closest_zero = fabs(sample - metric_real[hardpoints[2 * sample_index] & ~(0x1 << level)]);
            closest_one  = fabs(sample - metric_real[hardpoints[2 * sample_index] |  (0x1 << level)]);


// #ifdef CONSIDERING_SNR

            SNR = (float)signal_to_noise_ratio[sample_index];

            llr[2 * sample_index] = (closest_zero - closest_one) * SNR;


            sample = (float)received_imag[sample_index];  /* extract imaginary part */
            closest_zero = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] & ~(0x1 << level)]);
            closest_one  = fabs(sample - metric_imag[hardpoints[2 * sample_index + 1] |  (0x1 << level)]);



// #ifdef CONSIDERING_SNR

            llr[2 * sample_index + 1] = (closest_zero - closest_one) * SNR;


         }

         error = viterbi_decode (llr, 2 * N, 2 * N1, puncturing[(int)PL1[level]],
                                 puncturing[(int)PL2[level]], tailpuncturing[rp[level]],
                                 infoout[level], hardpoints, level, Deinterleaver + 2 * N * level,
                                 (int)L1[level] + (int)L2[level] + 6, rp[level] + 12, viterbi_mem);


// #ifdef ITER_BREAK
         if (level == 0)
         {
            diff = 0;
            for (sample_index = 0; sample_index < 2 * N * sizeof(char) / sizeof(int); sample_index++)
            {
               diff += (((int *)hardpoints)[sample_index] ^ ((int *)lastiter)[sample_index]) != 0;

            }
            /*diff = memcmp (lastiter,hardpoints,2 * N); */
            if (!diff)
            {
               break;
            }
         }
// #endif
      }

// #ifdef ITER_BREAK
      if (!diff)
      {
         break;
      }
// #endif
      iteration++;
   }


   for (m = 0;m < 4674;m++)
   {
      result[m] = (int)hardpoints[m];
   }


   free(memory_ptr);

   return;
}


char puncturing[13][17] = { {0, 15, 0},
                            { -4, 15, 2, 7, 2, 7, -4},
                            {  0, 7, 0},
                            { -6, 7, 2, 7, 2, 7, 2, 3, -6},
                            {  0, 3, 0},
                            { -6, 3, 2, 5, 2, 3, 2, 1, -6},
                            { -4, 3, 2, 1, 2, 3, -4},
                            { -2, 3, 2, 1, -2},
                            { -14, 3, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 3, 2, 1, -14},
                            { -4, 3, 2, 1, 2, 1, -4},
                            { -6, 3, 2, 1, 2, 1, 2, 1, -6},
                            { -12, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, -12},
                            { -14, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, -14}};

int RX[13] = {1, 3, 1, 4, 1, 4, 3, 2, 8, 3, 4, 7, 8};
int RY[13] = {4, 10, 3, 11, 2, 7, 5, 3, 11, 4, 5, 8, 9};

char tailpuncturing[12][13] = { { -10, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, -10},
                                { -10, 7, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, -10},
                                { -10, 7, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, -10},
                                { -10, 7, 2, 7, 2, 3, 2, 7, 2, 3, 2, 3, -10},
                                { -10, 7, 2, 7, 2, 3, 2, 7, 2, 7, 2, 3, -10},
                                { -10, 7, 2, 7, 2, 7, 2, 7, 2, 7, 2, 3, -10},
                                { -10, 7, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, -10},
                                { -10, 15, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, -10},
                                { -10, 15, 2, 7, 2, 7, 2, 15, 2, 7, 2, 7, -10},
                                { -10, 15, 2, 15, 2, 7, 2, 15, 2, 7, 2, 7, -10},
                                { -10, 15, 2, 15, 2, 7, 2, 15, 2, 7, 2, 15, -10},
                                { -10, 15, 2, 15, 2, 15, 2, 15, 2, 7, 2, 15, -10}};


#define SQRT2 1.41421356237310F
#define SQRT10 3.16227766016838F
#define SQRT42 6.48074069840786F

float partitioning[4][8] = { {7 / SQRT42, 5 / SQRT42, 3 / SQRT42, 1 / SQRT42, -1 / SQRT42, -3 / SQRT42, -5 / SQRT42, -7 / SQRT42}, /* 64-QAM Ungerb�k Set Partitioning */
                             {7 / SQRT42, -1 / SQRT42, 5 / SQRT42, -3 / SQRT42, 3 / SQRT42, -5 / SQRT42, 1 / SQRT42, -7 / SQRT42}, /* 64-QAM Block Partitioning */
                             {3 / SQRT10, 1 / SQRT10, -1 / SQRT10, -3 / SQRT10},            /* 16-QAM Ungerb�k Set Partitioning */
                             {1 / SQRT2, -1 / SQRT2} };                 /*  4-QAM Ungerb�k Set Partitioning */

#undef SQRT2
#undef SQRT10
#undef SQRT42



#include <stdlib.h>


int viterbi_decode (float *llr, int N, int N_PartA, char *puncturing1, char *puncturing2, char *puncturing3,
                    char *infoout, char *cwout, int bitpos, int *Deinterleaver, int L, int N_tail, char *memory_ptr)
{



   float *old_metrics, *new_metrics, inf = (float)1e20;
   char *path_reg;
   char *puncture_ptr;
   void *swap_ptr;
   int symbol_index, j, symbol_pos, symbol_pos2, symbol_pos3;
   float symbols_acc[QOFB];
   float metric_path2, metric_s1, metric_s2, metric_inc;
   char mask, codebits;
   int part, state, N_Part, path_reg_index, butterfly, info_index;

   if (!llr || !infoout || !cwout || !memory_ptr)
   {
      return -1;
   }





   old_metrics = (float *)(memory_ptr + 0);
   new_metrics = (float *)(memory_ptr + STATES * sizeof(float));
   path_reg = (char *)(memory_ptr + STATES * sizeof(float) + STATES * sizeof(float));

   for (j = 1; j < STATES; j++)
   {
      old_metrics[j] = -inf;
   }
   old_metrics[0] = 0;


   symbol_index = 0;
   path_reg_index = 0;
   puncture_ptr = puncturing1 + 1;
   N_Part = N_PartA;

   for (part = 0; part < 3; part++)
   {

      while (symbol_index < N_Part)
      {

         symbol_pos = Deinterleaver[symbol_index];
         symbols_acc[0] = -llr[symbol_pos];
         symbols_acc[1] =  llr[symbol_pos];
         symbols_acc[2] = -llr[symbol_pos];
         symbols_acc[3] =  llr[symbol_pos];

         switch (*puncture_ptr)
         {

            case 3:
               symbol_pos = Deinterleaver[symbol_index + 1];
               symbols_acc[0] += -llr[symbol_pos];
               symbols_acc[1] += -llr[symbol_pos];
               symbols_acc[2] +=  llr[symbol_pos];
               symbols_acc[3] +=  llr[symbol_pos];
               symbol_index += 2;
               break;
            case 5:
               symbol_pos = Deinterleaver[symbol_index + 1];
               symbols_acc[0] += -llr[symbol_pos];
               symbols_acc[1] += -llr[symbol_pos];
               symbols_acc[2] += -llr[symbol_pos];
               symbols_acc[3] += -llr[symbol_pos];
               symbol_index += 2;
               break;
            case 7:
               symbol_pos = Deinterleaver[symbol_index + 1];
               symbol_pos2 = Deinterleaver[symbol_index + 2];
               symbols_acc[0] += -llr[symbol_pos] - llr[symbol_pos2];
               symbols_acc[1] += -llr[symbol_pos] - llr[symbol_pos2];
               symbols_acc[2] +=  llr[symbol_pos] - llr[symbol_pos2];
               symbols_acc[3] +=  llr[symbol_pos] - llr[symbol_pos2];
               symbol_index += 3;
               break;
            case 15:
               symbol_pos = Deinterleaver[symbol_index + 1];
               symbol_pos2 = Deinterleaver[symbol_index + 2];
               symbol_pos3 = Deinterleaver[symbol_index + 3];
               symbols_acc[0] += -llr[symbol_pos] - llr[symbol_pos2] - llr[symbol_pos3];
               symbols_acc[1] += -llr[symbol_pos] - llr[symbol_pos2] + llr[symbol_pos3];
               symbols_acc[2] +=  llr[symbol_pos] - llr[symbol_pos2] - llr[symbol_pos3];
               symbols_acc[3] +=  llr[symbol_pos] - llr[symbol_pos2] + llr[symbol_pos3];
               symbol_index += 4;
               break;
            default:
               symbol_index++;
         }

         puncture_ptr += *(puncture_ptr + 1);

         symbols_acc[7] = -symbols_acc[0];
         symbols_acc[6] = -symbols_acc[1];
         symbols_acc[5] = -symbols_acc[2];
         symbols_acc[4] = -symbols_acc[3];

         //INTERNAL VITERBI KERNEL...MOST OF THE TIME IS SPENT HERE
         for (butterfly = 0; butterfly < NOOFBF; butterfly++)
         {
            metric_s1 = old_metrics[butterfly];
            metric_s2 = old_metrics[butterfly + NOOFBF];
            metric_inc = symbols_acc[CODER_OUTPUT[butterfly]];

            new_metrics[2 * butterfly] = metric_s1 + metric_inc;
            path_reg[path_reg_index + 2 * butterfly] = 0;
            metric_path2 = metric_s2 - metric_inc;     /* Add */
            if (metric_path2 > new_metrics[2 * butterfly])
            {   /* Compare */
               new_metrics[2 * butterfly] = metric_path2;
               path_reg[path_reg_index + 2 * butterfly] = 1;   /* Select */
            }
            new_metrics[2 * butterfly + 1] = metric_s1 - metric_inc;
            path_reg[path_reg_index + 2 * butterfly + 1] = 0;
            metric_path2 = metric_s2 + metric_inc;     /* Add */
            if (metric_path2 > new_metrics[2 * butterfly + 1])
            {   /* Compare */
               new_metrics[2 * butterfly + 1] = metric_path2;
               path_reg[path_reg_index + 2 * butterfly + 1] = 1;  /* Select */
            }

         }
         /* are hard coded butterflies faster? */

         path_reg_index += STATES;
         swap_ptr = old_metrics;
         old_metrics = new_metrics;
         new_metrics = swap_ptr;
      }

      if (part == 0)
      {
         puncture_ptr = puncturing2 + 1;
         N_Part = N - N_tail;
      }
      else
      {

         puncture_ptr = puncturing3 + 1;
         N_Part = N;
      }

   }



   /* trace back */
   state = 0;
   symbol_index = N - 1;
   info_index = L - 1;
   N_Part = N - N_tail;
   path_reg_index -= STATES;
   puncture_ptr = puncturing3 + 1 - *puncturing3;

   for (part = 2; part >= 0; part--)
   {
      while (symbol_index >= N_Part)
      {
         infoout[info_index] = state & 0x1;  /* information bit output */
         info_index--;
         mask = 0 - ((state & 0x1) ^ path_reg[path_reg_index + state]);
         state = (state >> 1) | (path_reg[path_reg_index + state] * NOOFBF);
         /* code bits ouput and interleaving: */
         codebits = CODER_OUTPUT[state & ~(NOOFBF)] ^ mask;
         switch (*puncture_ptr)
         {

            case 3:
               cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x2) >> 1) << bitpos;
               symbol_index -= 2;
               break;
            case 5:
               cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x4) >> 2) << bitpos;
               symbol_index -= 2;
               break;
            case 7:
               cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index]] |= ((codebits & 0x4) >> 2) << bitpos;
               cwout[Deinterleaver[symbol_index - 1]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index - 1]] |= ((codebits & 0x2) >> 1) << bitpos;
               symbol_index -= 3;
               break;
            case 15:
               cwout[Deinterleaver[symbol_index]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index]] |= (codebits & 0x1) << bitpos;
               cwout[Deinterleaver[symbol_index - 1]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index - 1]] |= ((codebits & 0x4) >> 2) << bitpos;
               cwout[Deinterleaver[symbol_index - 2]] &= ~(0x1 << bitpos);
               cwout[Deinterleaver[symbol_index - 2]] |= ((codebits & 0x2) >> 1) << bitpos;
               symbol_index -= 4;
               break;
            default:
               symbol_index --;
         }

         cwout[Deinterleaver[symbol_index + 1]] &= ~(0x1 << bitpos);
         cwout[Deinterleaver[symbol_index + 1]] |= (codebits & 0x1) << bitpos;

         path_reg_index -= STATES;
         puncture_ptr -= *(puncture_ptr - 1);
      }

      if (part == 2)
      {
         puncture_ptr = puncturing2 + 1 - *puncturing2;
         N_Part = N_PartA;
      }
      else
      {
         puncture_ptr = puncturing1 + 1 - *puncturing1;
         N_Part = 0;
      }

   }

   return 0;
}

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void msd_hard_old_original(int *result);
void msd_hard_old_modified(int *result);
void msd_hard_new_original(int *result);
void msd_hard_new_modified(int *result);


int msd_hard_old_original_result[4674];
int msd_hard_old_modified_result[4674];
int msd_hard_new_original_result[4674];
int msd_hard_new_modified_result[4674];


void main (void)
{

   int m, n;
   //calling the old original function msd (Multi Stage Decoding)
   msd_hard_old_original(msd_hard_old_original_result);
   n = 0;
   //comparing the result of the original function whit the reference generated with Matab
   for (m = 0;m < 4674;m++)
   {
      if (hardpoints1[m] != msd_hard_old_original_result[m])
      {
         n++;
         printf("error in position %d\n", m);
      }
   }
   if(n == 0) printf("Zero Errors In msd_hard_old_original\n");

   n = 0;
   //calling the old modified function msd (Multi Stage Decoding)
   msd_hard_old_modified(msd_hard_old_modified_result);
   //comparing the result of the modified function whit the reference generated with Matab
   for (m = 0;m < 4674;m++)
   {
      if (hardpoints1[m] != msd_hard_old_modified_result[m])
      {
         n++;
         printf("error in position %d\n", m);
      }
   }
   if(n == 0) printf("Zero Errors In msd_hard_old_modified\n");

   //calling the new original function msd (Multi Stage Decoding)
   msd_hard_new_original(msd_hard_new_original_result);
   //comparing the result of the modified function whit the reference generated with Matab
   for (m = 0;m < 4674;m++)
   {
      if (hardpoints1[m] != msd_hard_new_original_result[m])
      {
         n++;
         printf("error in position %d\n", m);
      }
   }
   if(n == 0) printf("Zero Errors In msd_hard_new_original\n");

   //calling the new modified function msd (Multi Stage Decoding)
   msd_hard_new_modified(msd_hard_new_modified_result);
   //comparing the result of the modified function whit the reference generated with Matab
   for (m = 0;m < 4674;m++)
   {
      if (hardpoints1[m] != msd_hard_new_modified_result[m])
      {
         n++;
         printf("error in position %d\n", m);
      }
   }
   if(n == 0) printf("Zero Errors In msd_hard_new_modified\n");

   return;
}


